繁体   English   中英

无法在方法中访问数组?

[英]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 = ...

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

初始化应该是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM