无法在方法中访问数组?

时间:2013-11-13 21:25:25

标签: java arrays methods reference nullpointerexception

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

5 个答案:

答案 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 = ...

  1. 这听起来好像很受欢迎,但是这些检查都是在编译时完成的,根本不会影响运行时性能。

答案 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()方法中打印值时,使用的实例变量板仍为空。