Java 无法从静态上下文引用非静态变量arr

Java 无法从静态上下文引用非静态变量arr,java,scope,non-static,static,Java,Scope,Non Static,Static,我已经阅读了有关范围和访问控制的Oracle文档,但它并没有坚持下去,所以我假设我的问题来自于我未能理解。。。无论如何,这是我的密码。我试图访问在数组中创建的唯一Player对象,并使用Player类中的方法更改它们的唯一变量,如它们的余额。欢迎提供任何解决方案,特别是解释 public class Player { private int currentBal; private String myName; private int rollOne; private int rollTwo; p

我已经阅读了有关范围和访问控制的Oracle文档,但它并没有坚持下去,所以我假设我的问题来自于我未能理解。。。无论如何,这是我的密码。我试图访问在数组中创建的唯一Player对象,并使用Player类中的方法更改它们的唯一变量,如它们的余额。欢迎提供任何解决方案,特别是解释

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;
}
}

错误“Java.lang.NullPointerException:null”

您的主方法是静态方法。它实际上在从类创建任何对象之前就存在,因此无法直接访问实例变量和方法。除非为类创建一个对象,即
Launcher-Launcher=new-Launcher(),否则不能从同一类访问非静态方法或变量

在这种情况下,您的播放器阵列
arr
不是静态的。您需要将此设置为静态,或者创建一个
启动器
对象,并从中访问变量。在后一种情况下,需要将
arr
数组公开

第一个选项要求您将播放器数组声明更改为
private static player arr

第二个要求您将
arr
数组的访问权限更改为public,并像这样访问它:
launcher.arr

关于第二个错误,您需要这样做:
arr=myArray.getPlayerArray()

或者像这样直接访问数组:
myArray.getPlayerArray()[0]
(对于该数组中的第一项)。

将变量设置为静态,因为main是一个静态方法,所以不能引用非静态方法

因此,将变量置于顶部,如:

private static Player[] arr;

变量
'Player[]arr'
是实例变量,即它应该属于特定实例。静态方法
'main'
无法直接从其所在的类中访问实例变量,因为它没有对该类的任何特定实例的显式引用(简单地说,此时您没有
Player[]arr
所属的实例).

由于启动器没有实例,因此其非静态成员不存在。静态方法main无法访问这样的对象-在这种情况下,您的arr不存在。您可能希望将其设置为静态以使其工作


阅读

这可以帮助您了解一些信息。对于初学者,下次您收到错误消息时,请尝试在Google中复制粘贴整个错误消息(在剥离程序特定的类/方法/变量名称之后)。编辑并更改了我的上述代码以显示新的错误,请查看。@Shamikul_Amin可能应该添加我的PlayerArray类,以便您可以查看到底发生了什么。我希望用户选择数组的大小以及它将创建和容纳多少个对象。那么,使arr静态发生什么变化呢?我读过Oracle文档,但不理解它们…您必须通过launcher对象访问数组,如下所示:
launcher.arr
。但是,这要求数组是公共的,因此只需将数组设置为静态的,就像这样
private static Player[]arr
。将
arr
设置为静态意味着Launcher类型的所有对象将共享一个
arr
实例,这意味着你可以从类而不是一个特定的对象访问它。我已经这样做了,但是让它保持静态和保持正常有什么区别呢?不管怎样,它允许我编译,所以我将测试它,看看它是否会出错,谢谢。出于您的目的,除了您可以在主方法中直接访问它之外,没有其他内容。从技术角度来看,静态意味着Launcher类型的所有对象将共享相同的
arr
数组。不使其成为静态将意味着每个启动器对象都有自己的arr数组。因为您没有创建任何launcher对象,所以不必担心这一点。
private static Player[] arr;