[英]Can't access array in method?
我已经初始化并填充了一个数组,但是除了填充的数组以外,我无法用其他任何方法访问其值。如果尝试在其他方法中使用它,则会得到nullPointerException。 例如,如果我在初始化方法中说“ 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
}
LifeCell[][] board = new LifeCell[10][10];
应该
board = new LifeCell[10][10];
通过在init()
方法中将其重新定义为LifeCell[][]
,您可以创建一个新的变量board
,其作用域仅限于该方法。 之后,您尝试打印位于类范围内(且未初始化)的board
阵列,这会给您带来错误。
在Java中,可以有一个局部变量和一个同名的实例变量。 但是优先顺序是先检查名称是否为本地变量,然后检查实例变量(如果本地版本不存在,则为实例变量)(1),除非this
指定。
这里发生的是,不是初始化要创建新板的“ board”的实例副本,而是仅在init()
本地进行。 班上其余的人看不到它。
board = new LifeCell[10][10];
只需删除板子左侧的类型声明,它就应该知道将其分配给实例变量。 更明确地说,您可以说this.board = ...
初始化应该是:
board = new LifeCell[10][10];
使用LifeCell[][] board = new LifeCell[10][10];
您正在声明和实例化一个新的局部变量,其范围仅限于init方法。
那是因为在方法内部声明的变量是local
变量,除了在声明的内部方法之外,它们在其他任何方法中均不可用。 要使用第二种方法,您必须将其作为方法参数传递,或者只是将数组声明为类的字段。 该类中的每个方法都可以使用它。 如我所见,您已经对这样的字段进行了分类,但是通过对与字段相同名称的local进行了覆盖,从而用局部变量覆盖了它。
LifeCell[][] board = new LifeCell[10][10];
表示您正在创建LifeCell数组类型的对象,并将其分配给NEW LOCAL变量board
。请注意,此时实例变量board
仍为null。 当您在init方法中执行System.out.println(board[2][2])
,将使用局部变量(因为它是在同一方法中声明的)。 尝试在test()方法中打印值时,将使用实例变量板,该变量仍为null。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.