当您使用Java进行开发已有15年并且同事要求您帮助他们调试空指针异常时,您不会感到惊讶。 通常,很明显什么是null,唯一要做的就是找出原因。
有时会有些困难,因为有人创建了一系列取消引用的对象。 前几天,我遇到了一些新东西,并感到困惑了一段时间。 用Java调试最简单的事情之一就是一时的神秘感。
考虑下面的代码,并告诉我空指针异常在哪里:
return value;
没错,NPE被抛出一个简单的return语句。
怎么会这样 没有明显的取消引用。 没有引用为空。 那句话很简单。 让我稍微扩展一下代码视图,以便您更好地了解发生了什么:
public int getValue(){return value;}
再一次,我们正在看非常简单的代码。 在上面的代码和文章标题中的提示之间,您可能已经知道发生了什么,或者您可能更加困惑。 再次没有明确地取消引用。 不仅我们甚至没有处理引用,它还返回一个原语。
您从线索中找出来了吗? 好的,这是其余的代码和说明:
package Example;
publicclass Example {Integer value;public int getValue(){return value;}
}
注意,value是一个以大写I表示的Integer,而getValue返回int。
在Java 5之前的过去,您会在上述代码上遇到编译错误。 但是Java 5引入了自动装箱 。 这个功能在我的Java职业生涯中已经存在了将近一半,并且从未使我感到困惑或困惑。 它一直是一个方便的功能。
自动装箱允许在基元及其等效的第一类对象之间进行无缝转换。 因此,您无需分配value.intValue即可获取原语,而只需分配值即可。 但是在幕后它仍然调用intValue方法。
那就是NPE发生的地方。 有问题的行变为:
return value.intValue();
在那条线上,很明显NPE发生在哪里。
哦,万一有人错过它,那么体育拳击运动就叫做Sweet Science。 我觉得自己被Autoboxing吸引住了,因此是本文的名称。
翻译自: https://www.javacodegeeks.com/2014/10/java-and-the-sweet-science.html