我有一个数组被初始化和填充,但是我无法在其填充的任何其他方法中访问它的值。如果我尝试在其他方法中使用它,我会得到一个nullPointerException。例如,如果我在init方法中说“System.out.println(board [2] [2])”它可以工作,但在另一个方法中抛出nullPointerException。我已经花了好几个小时才搞清楚,但不知道出了什么问题?任何人都可以对我的问题有所了解吗?非常感谢。感谢
public class Program2 extends JPanel implements ActionListener
{
private LifeCell[][] board;
private JButton next;
private JFrame frame;
public static void main(String[] args) {new Program2();}
public Program2()
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(this);
this.init();
frame.pack();
frame.setVisible(true);
}
public void init()
{
LifeCell[][] board = new LifeCell[10][10];
this.setPreferredSize(new Dimension(400, 500));
this.setLayout(null);
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
board[r][c] = new LifeCell(board, r, c);
this.add(board[r][c]);
board[r][c].setBounds(x,y,40,40);
this.setVisible(true);
System.out.println(board[2][2]) //works
}
}
}
public void test(){ System.out.println(board[2][2])}//doesn't work
}
答案 0 :(得分:5)
LifeCell[][] board = new LifeCell[10][10];
应该是
board = new LifeCell[10][10];
通过在LifeCell[][]
方法中将其重新定义为init()
,您将创建一个新变量board
,其范围仅限于该方法。之后,您尝试打印类范围内的board
数组(并且未初始化),这会给您带来的错误。
答案 1 :(得分:3)
在java中,您可以拥有一个局部变量和一个具有相同名称的实例变量。优先顺序是先检查名称为first的局部变量,然后检查本地版本不存在的实例变量(1),除非用this
指定。
这里发生的事情不是初始化您正在创建新电路板的“电路板”的实例副本,而是仅在本地init()
初始化。你班上的其他人都没有看到它。
board = new LifeCell[10][10];
只需删除board左侧的类型声明,它应该知道将它分配给实例变量。为了更明确,您可以说this.board = ...
答案 2 :(得分:2)
在init中它应该是:
board = new LifeCell[10][10];
使用LifeCell[][] board = new LifeCell[10][10];
,您声明并实例化一个新的局部变量,其范围仅限于init方法。
答案 3 :(得分:1)
这是因为在方法中声明的变量是local
变量,并且它们在声明它们之外的任何其他方法中都不可用。要在第二种方法中访问,必须将其作为方法参数传递,或者只是将数组声明为类'字段。它将在这类课程的每种方法中都可用。
正如我所看到的那样,你已经在这样的领域进行了平局,但是你用局部变量来覆盖它,通过使用与字段同名的本地变换。
答案 4 :(得分:1)
LifeCell[][] board = new LifeCell[10][10];
表示您正在创建LifeCell数组类型的对象并将其分配给NEW LOCAL变量board
。请注意,此时实例变量board
仍为空。在init方法中执行System.out.println(board[2][2])
时,将使用局部变量(因为它是在同一方法中声明的)。尝试在test()方法中打印值时,使用的实例变量板仍为空。