java中一个简单空检查的NullPointerException

java中一个简单空检查的NullPointerException,java,null,rmi,nullpointerexception,Java,Null,Rmi,Nullpointerexception,我在一行上得到一个NullPointerException,在该行上只进行了一次简单的null检查。该行如下所示: if(routingTable[commonBitGroups][nextNumberOfOther-1]==null) 我验证数组在这一行之前不是空的。 commonBitGroups和nextNumberOfOther都是简单的int类型 我应该补充一点,这一行是使用rmi的应用程序的一部分,也是扩展UnicastRemoteObject并实现RemoteInterface的

我在一行上得到一个NullPointerException,在该行上只进行了一次简单的null检查。该行如下所示:

if(routingTable[commonBitGroups][nextNumberOfOther-1]==null)
我验证数组在这一行之前不是空的。 commonBitGroups和nextNumberOfOther都是简单的int类型


我应该补充一点,这一行是使用rmi的应用程序的一部分,也是扩展UnicastRemoteObject并实现RemoteInterface的类的一部分。我指定这一行是因为我的印象是,在处理同步时可能会发生NullPointerException,即使没有任何内容是真正的null(可能是在某些内容被锁定时),我在这个应用程序中处理同步。虽然包含行的方法没有同步,但在我的代码中没有任何地方我尝试将数组用作监视器(我只有一些同步方法,没有较小的同步块,所以我没有地方明确选择特定的监视器)。

如果以下行抛出NPE:

if (routingTable[commonBitGroups][nextNumberOfOther - 1] == null)
然后
routingTable
null
routingTable[commonBitGroups]
null


您可以说数组的初始化如下所示:

routingTable = new NodeId [32][15]; 
Arrays.fill(routingTable, null);
“这就是你的问题!”

第一行给出一个32个NodeId[]的数组,其中元素初始化为非空值。。。大小为15的数组。(到目前为止还不错……)

第二行将所有
i
routingTable[i]
设置为
null
。。。。哎呀


删除第二行。

如果下一行抛出NPE:

if (routingTable[commonBitGroups][nextNumberOfOther - 1] == null)
然后
routingTable
null
routingTable[commonBitGroups]
null


您可以说数组的初始化如下所示:

routingTable = new NodeId [32][15]; 
Arrays.fill(routingTable, null);
“这就是你的问题!”

第一行给出一个32个NodeId[]的数组,其中元素初始化为非空值。。。大小为15的数组。(到目前为止还不错……)

第二行将所有
i
routingTable[i]
设置为
null
。。。。哎呀


删除第二行。

正如@Gabe所说,可能是routingTable[commonBitGroups]为空。Java没有真正的多维数组:二维数组是数组的数组(而三维数组是数组的数组)

顺便说一句,您不必在Java中将数组中的引用初始化为null,这是它们的默认值。在这种情况下,这也是你的问题。您正在将第二级数组值设置为null。你的意思是

for (int i = 0; i < 32; i++) {
    Arrays.fill(routingTable[i], null);
}
for(int i=0;i<32;i++){
Arrays.fill(routingTable[i],null);
}

但如上所述,这是不必要的。所以只需删除对Arrays.fill的调用。

正如@Gabe所说,可能是routingTable[commonBitGroups]为空。Java没有真正的多维数组:二维数组是数组的数组(而三维数组是数组的数组)

顺便说一句,您不必在Java中将数组中的引用初始化为null,这是它们的默认值。在这种情况下,这也是你的问题。您正在将第二级数组值设置为null。你的意思是

for (int i = 0; i < 32; i++) {
    Arrays.fill(routingTable[i], null);
}
for(int i=0;i<32;i++){
Arrays.fill(routingTable[i],null);
}

但如上所述,这是不必要的。因此,只需删除对array.fill的调用。

您是否检查了
routingTable
routingTable[commonBitGroups]
是否为null?数组是用null值构造和填充的。数组本身不是null。我这样构造和填充它:routingTable=new NodeId[32][15];Arrays.fill(routingTable,null);
new
为您提供了一个一维数组。调用
arrays.fill
后,每个嵌套数组都是
null
。因此,NPE。解决方案:不要调用
数组。填充
。谢谢!现在可以了!你说得对。为什么关于NPE的问题还被问到这么久?这就是导致NPE的原因:
someExpressionthatEvaluateTestOnll.x
(或者是有人手动抛出异常——这是有问题的,很少是NPE问题的罪魁祸首)。不要让生活变得更艰难。你检查过
routingTable
routingTable[commonBitGroups]
是否为空吗?数组是用空值构造和填充的。数组本身不是空的。我这样构造和填充它:routingTable=new NodeId[32][15];Arrays.fill(routingTable,null);
new
为您提供了一个一维数组。调用
arrays.fill
后,每个嵌套数组都是
null
。因此,NPE。解决方案:不要调用
数组。填充
。谢谢!现在可以了!你说得对。为什么关于NPE的问题还被问到这么久?这就是导致NPE的原因:
someExpressionthatEvaluateTestOnll.x
(或者是有人手动抛出异常——这是有问题的,很少是NPE问题的罪魁祸首)。不要让生活变得更艰难。