有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用数组中的get()时使用java NPE。asList列表

我试图访问数组中的一个元素。asList-List,但我有一个NPE

主要类别:

public class Game  {
    List<Cell> cells = null;


    public Game  () {
        cells = new ArrayList<>();
        cells.addAll(Arrays.asList(new Cell[80])); //Target: Add 80 additional list elements
    }

    public int getSelectedValue () {
        return cells.get(10).value;   //Here I get the NPE, but I need the 10th cell
    }

}

亚类细胞:

public class Cell {
    int row;
    int col;
    int value;
}

如何使用get()操作符引用一个包含许多对象(需要100个)的列表,并访问这些元素


共 (1) 个答案

  1. # 1 楼答案

    要求对象的字段为null会引发异常

    您建立了一个包含80个插槽的数组,这些插槽能够指向Cell对象。但您从未创建过任何Cell对象。因此,所有80个插槽都没有指向任何内容,它们是null

    然后将该空数组添加到一个空的ArrayList。仍然没有Cell对象存在,因此ArrayList没有Cell对象,只有空值。您确实创建了一个包含80个插槽的List,但所有插槽都是空的(null)

    然后,您要求从列表的第11个位置(索引为10)引用对象。还有第十一个位置。但是在第十一个槽中没有对象引用。所以你从列表中检索到一个空值

    您试图从该空值访问Cell中定义的value字段。但是你手头没有Cell对象。你手里只有一个空的。空表示什么也没有。试图访问空值(空值)上的字段(或调用方法)毫无意义。所以Java抛出了一个NullPointerException

    要验证手头是否有对象引用而不是空引用,请执行以下操作:

    if( Objects.nonNull( eleventhCell ) ) {…}
    

    使用early access Java 16定义一条记录,这是创建类的一种简化方法

    record Cell ( int row, int col, int val ) {} ;
    
    int initialCapacity = 80 ;
    List< Cell > cells = new ArrayList<>( initialCapacity ) ;
    for( int i = 1 ; i <= initialCapacity ; i ++ )
    {
        cells.add(
            new Cell( 
                ThreadLocalRandom.current().nextInt( 1 , 100 ) ,
                ThreadLocalRandom.current().nextInt( 1 , 100 ) ,
                ThreadLocalRandom.current().nextInt( 1_000 , 10_000 ) 
            )
        );
    }
    Cell eleventhCell = cells.get( 10 ) ;
    if( Objects.nonNull( eleventhCell ) )  // If in doubt, verify not null.
    { 
        int eleventhVal = eleventhCell.val ; 
    }
    
    

    顺便说一下,value对于Java中的字段来说是个糟糕的名字。作为程序员,我们一直使用这个术语。讨论“价值的价值”会让人很困惑