奇怪的地方扔空指针

时间:2014-03-23 03:47:15

标签: java nullpointerexception null

我尝试使用以下代码检查字段是否为空:

其余代码循环访问对象的ArrayList,同时尝试查看某个字段是否为空,以便从列表中选择它们。此片段用于测试对象是否具有某个字段为空。

if(obj.getfield() != null)
{
    //Take it out of the list
}
else
{
    //Do nothing
}

但是,只要返回null,obj.getfield()!= null行就会抛出NullPointerException。运气有什么猜测它的原因吗?

非常感谢。

编辑:obj == null返回false。

4 个答案:

答案 0 :(得分:1)

NPE的唯一合理的解释引发了这一行:

    if (obj.getfield() != null)

此时objnull

  • 检查obj是否已初始化为非空
  • 检查obj未被更改
  • 检查您是否还没有声明一个本地obj,它隐藏了一个具有相同名称的实例变量......或类似的东西 值
  • 如果obj的值来自其他地方,请找出值为null的原因

使用==比较对象引用不会引发NullPointerException

(原始数字类型与盒装类型的比较可以提升NPE ...如果盒装值为null ......但是不会发生在这里,假设obj是一个引用类型。但如果你足够坚定地声明private int obj ...)


如果这不能解答您的问题,请提供<{3}} 演示问题。

答案 1 :(得分:0)

我的猜测是obj为null。

您需要像这样创建obj实例

    Object obj = new Object();

修改

另一种可能性是你没有声明getField()在任何obj的实例的构造函数内返回的字段。 实施例

Class x
   int[] array;
   public x(){
      //does not contain 'array = new int[5];'
   }

答案 2 :(得分:0)

objnull会发生什么情况,因此您无法调用其方法getfield()

  

但通常java仍允许我将null与null进行比较。

您没有将nullnull进行比较,而是进行比较

if (null.getfield() != null)

实际上,单独表达

obj.getfield()

抛出异常,因此如果将其与null进行比较并不重要。

答案 3 :(得分:0)

您可以通过先测试obj是否为null来避免异常,因此对obj字段的测试不在null对象上。

    if(obj != null && obj.getfield() != null)
    {
        //Take it out of the list
    }

如果什么都不做,你似乎不需要else子句。希望这很有用。