list中的get()时的java-npe

z8dt9xmd  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(450)

这个问题在这里已经有答案了

什么是nullpointerexception,如何修复它(12个答案)
5天前关门了。
我试图访问arrays.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个)的列表并访问这些元素?

tvmytwxo

tvmytwxo1#

在调用对象上的函数之前,总是在对象上添加null检查,以避免npe
例如。

public int getSelectedValue () {
 if(cells !=null && cells.size() >0) 
   { 
    if(cells.get(10) !=null)
       return cells.get(10).value;   
   }
    else return null;
}
0ejtzxu1

0ejtzxu12#

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

您建立了一个包含80个插槽的阵列,可以指向 Cell 物体。但你从来没有创造过 Cell 物体。所以所有的80个插槽都没有指向任何东西,它们是 null .
然后将该空数组添加到空数组中 ArrayList . 还是没有 Cell 物体存在,所以 ArrayList 没有 Cell 对象,仅为空。你创造了一个 List 80个插槽,但所有插槽都为空(null)。
然后,您要求从列表的第11个槽(索引为10)引用对象。有第十一个槽。但是在第十一个槽中没有对象引用。所以你从列表中检索到一个空值。
从这个空值你试图访问 value 中定义的字段 Cell . 但你没有 Cell 手里的东西。你手里只有一个空的。空表示什么也没有。试图访问一个字段(或调用一个方法)在一个空值上(在空值上)是没有意义的。所以java抛出了一个 NullPointerException .
要验证是否有对象引用而不是空引用,请执行以下操作:

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

使用EarlyAccessJava16定义一个记录,这是创建类的一种简化方法。

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中的字段来说是个糟糕的名称。我们一直用这个词作为程序员。讨论“价值的价值”会很混乱。

相关问题