1

我已经初始化并填充了一个数组,但是除了填充的方法之外,我无法在任何其他方法中访问它的值。如果我尝试在其他方法中使用它,我会得到一个 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
}
4

5 回答 5

5
LifeCell[][] board = new LifeCell[10][10];

应该

board = new LifeCell[10][10];

通过将其重新定义为方法LifeCell[][]内部init(),您将创建一个新变量board,其范围仅限于该方法。之后,您尝试打印board在类范围内(并且未初始化)的数组,这会给您带来您遇到的错误。

于 2013-11-13T21:26:50.830 回答
3

在java中,你可以有一个局部变量和一个同名的实例变量。但是,优先顺序是首先检查具有名称的局部变量,然后如果本地版本不存在(1),则检查实例变量,除非使用this.

这里发生的事情不是初始化“板”的实例副本,而是您正在创建一个新板,但仅限于本地到init(). 你班上的其他人看不到它。

board = new LifeCell[10][10];

只需删除板左侧的类型声明,它应该知道将其分配给实例变量。更明确地说,你可以说this.board = ...

  1. 这听起来像是对性能的影响,但这些检查都是在编译时完成的,根本不会影响运行时性能。
于 2013-11-13T21:29:38.070 回答
2

在初始化它应该是:

board = new LifeCell[10][10];

随着LifeCell[][] board = new LifeCell[10][10];您声明和实例化一个新的局部变量,其范围仅限于 init 方法。

于 2013-11-13T21:29:22.740 回答
1

那是因为在方法内部声明的变量是local变量,并且它们在声明它们之外的任何其他方法中均不可用。要访问您的第二种方法,您必须将其作为方法参数传递,或者简单地将您的数组声明为类的字段。它将在此类中的每个方法中可用。正如我所看到的,您已经对此类字段进行了装饰,但是您通过使用与字段同名的本地变量来覆盖它。

于 2013-11-13T21:27:49.717 回答
1

LifeCell[][] board = new LifeCell[10][10]; 表示您正在创建一个 LifeCell 数组类型的对象并将其分配给 NEW LOCAL 变量board。请注意,此时实例变量board仍为空。当您System.out.println(board[2][2])在 init 方法中执行操作时,将使用局部变量(因为它是在同一方法中声明的)。当尝试在 test() 方法中打印值时,使用了仍然为空的实例变量 board。

于 2013-11-13T21:40:37.587 回答