2013-11-29 4 views
0

Я прочитал документы Oracle относительно области действия и контроля доступа, но это просто не прилипает, поэтому я предполагаю, что моя проблема исходит из моего неспособности понять. В любом случае Вот мой код. Я пытаюсь получить доступ к уникальным объектам Player, созданным в массиве, и изменять их уникальные переменные, например, их балансы, используя методы из класса Player. Любые решения и ОСОБЫЕ объяснения приветствуются!Нестатическая переменная arr не может ссылаться на статический контекст

public class Player 
{ 
private int currentBal; 
private String myName; 
private int rollOne; 
private int rollTwo; 
private int rollTotal; 
private int doublesCount; 
private int currentPosition; 
private int currentDoubles; 
private int move; 
private int moveMult; 
private int newBal; 
private boolean rollAgain; 
private boolean inJail; 
public Player(String userName, int changeInMoney) 
{ 
    myName = userName; 
    currentBal -= changeBalance(changeInMoney); 
} 

public int changeBalance(int changeInMoney){newBal -= changeInMoney; return newBal;} 

public int viewBalance(){return currentBal;} 

Это мой класс PlayerArray.

public class PlayerArray 
{ 
Scanner scan = new Scanner(System.in); 
private int numbHuman; 
private Player[] arr; 
private String[] userName; 
private int startingMoney; 
public PlayerArray() 
{ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("There will be 4 players, how many do you wish to be human? 0><4"); 
    numbHuman = scan.nextInt(); 
    while (numbHuman < 1 || numbHuman > 4) 
    { 
     System.out.println("Invalid entry, try again."); 
     numbHuman = scan.nextInt(); 
    }  
    arr = new Player[numbHuman]; 
    userName = new String[numbHuman]; 
    startingMoney = 1500; 
    for(int i = 0; i < arr.length; i++) 
    { 
     System.out.println("Player " + (i + 1) + ", Please enter your first name:"); 
     userName[i] = scan.next(); 
     arr[i] = new Player(userName[i],startingMoney); 
    } 
} 

public Player[] getPlayerArray() 
{ 
    int charge = 500; 
    arr[0].changeBalance(charge); 
    System.out.println(arr[0].viewBalance()); //look here as example 
    return arr; 
} 
} 

это мой класс игрока, минус некоторые методы, которые я не могу использовать до конца. Пыльник мой основной метод называют,

import java.util.Scanner; 
import java.util.Random; 
public class Launcher 
{ 
private Planet myTest; 
private PlanetInfo myPlanetInfo; 
private static Player[] arr; 
public static void main(String[] args) 
{ 
    Launcher testLauncher = new Launcher(); 
    PlayerArray myArray = new PlayerArray(); 
    Pay myCharge = new Pay(); // continue work on charges 
    myArray.getPlayerArray(); 
    //STILL TRYING TO GET BELLOW LINE TO WORK LAST NIGHT!!! 
    int testBal = arr[0].viewBalance(); //ERROR HERE 
    System.out.println("player 1's balance: " + testBal); 
} 
} 

Ошибка «java.lang.NullPointerException: нуль»

+0

Это может помочь вам о [почему?] (Http://javarevisited.blogspot.in/2012/02/why-non-static-variable-cannot-be.html) –

+0

Для начала , в следующий раз, когда вы получите сообщение об ошибке, попробуйте выполнить копирование всего сообщения об ошибке в Google (после удаления списков классов/методов/переменных для конкретной программы).[Вы будете удивлены результатами] (https://www.google.com/search?q=%22non-static+variable%22+%22cannot+be+referenced+from+a+static+context%22). – BalusC

+0

Отредактирован и изменен мой код выше, чтобы показать новую ОШИБКУ, пожалуйста, посмотрите там. –

ответ

1

Ваш основной метод является статическим методом. Он фактически существует до того, как какой-либо объект будет создан из вашего класса и, следовательно, не сможет напрямую обращаться к переменным и методам экземпляра. Вы не можете получить доступ к нестационарным методам или переменным из того же класса, если только вы не создадите объект для класса, то есть Launcher launcher = new Launcher();.

В этом случае ваш игровой массив arr не является статическим. Вам либо нужно сделать это статичным, либо создать объект Launcher и получить доступ к переменной оттуда. В последнем случае вам нужно будет сделать массив arr открытым.

Первый вариант требует, чтобы вы изменили объявление массива игроков на private static Player arr;.

Второе требует, чтобы вы изменили доступ массива arr к общедоступному и получили доступ к нему следующим образом: launcher.arr.

Что касается вашей второй ошибки, вам необходимо либо сделать это: arr = myArray.getPlayerArray(); или просто получить доступ к массиву непосредственно следующим образом: myArray.getPlayerArray()[0] (для первого элемента в этом массиве).

+0

Итак, что будет делать статическое изменение? Я читал документы Oracle, но я их не понимаю ... –

+0

Вам нужно получить доступ к массиву через объект запуска, например: 'launcher.arr'. Однако для этого требуется, чтобы массив был общедоступным, поэтому просто сделайте массив статическим, как этот 'private static Player [] arr'. –

+0

Создание статического значения 'arr' означает, что все объекты типа Launcher будут совместно использовать один экземпляр' arr', что означает, что вы можете получить к нему доступ из класса, а не для определенного объекта. –

0

Сделайте свои переменные статическими, поскольку main является статическим методом, вы не можете ссылаться на нестатические методы.

так что переменные сверху что-то вроде:

private static Player[] arr; 
1

Переменная 'Player[] arr' является переменной экземпляра, то есть он должен относится к конкретному экземпляру. Статический метод 'main' не может напрямую обращаться к переменной экземпляра из класса, в котором он находится, поскольку он не имеет явной ссылки на какой-либо конкретный экземпляр класса (просто сказал, что на данный момент у вас нет экземпляра, которому ваш Player[] arr принадлежит).

0

Поскольку ваш пусковой механизм не имеет экземпляра, ни один из его нестационарных элементов не существует. Статический метод main не может получить доступ к такому - в этом случае ваш arr не существует. Вы можете сделать его статическим, чтобы заставить его работать.

Читать static and instance members

Смежные вопросы