2010-05-13 63 views
2

在java中,下列行有可能(甚至0.01%)抛出NullPointerException?if(str1 == null)when throws a NullPointerException

public static void handleRequest(String str1){ 
    if (str1 == null){ // this line throws NPE, how come !! is it a JDK1.5 bug!! 
     return null; 
    } 
    // other staff 
} 

其实我在代码中落下了一些bug和它说,上述方法行exact抛出一个显示java.lang.NullPointerException?!

+3

“相似的行”不会削减它。你为什么不显示确切的路线? – PhiLho 2010-05-13 20:59:34

+2

问题仍然不符合答案,反之亦然。我没有看到接受的答案是如何回答现在编辑的问题的,这个“确切”的线。 – 2010-05-13 21:52:08

回答

19

不,在任何情况下该行不会抛出NullPointerException

但这取决于你所说的“相似”。例如,如果您的实际行代码是

if (foo.str1 == null) 

,那么你会得到一个NullPointerException如果foo为null。

+1

我帮助很多人调试。有时他们会问/暗示为什么我有不同的能力,有时他们只是很高兴能够通过路障。但是,如果他们给我一个开放(或者我厌倦了帮助他们),我指出了我正在使用的公理: *如果你知道的一切都告诉你,你看到的行为不可能是正确的,那么“你知道的每一件事”都是不对的。* 有系统地挑战你所有的假设,你会发现你的问题快了很多。如果您的repro案件没有重现错误,那不是重复案件。复制更多代码。改进模拟。深入研究。 – Jason 2010-05-13 21:58:57

10
if (str1 == null) 

不会抛出NullPointerException。

if(str1.equals(null)) 

确实有这种可能性。

编辑:

如果以上是由您的堆栈跟踪引用的行,还有一个非常现实的机会,你正在运行的代码不匹配,你正在寻找的代码。如果您在编译和部署它之后对类进行了修改,则可能会发生这种情况,从而导致错误匹配的行号。

+0

实际上,if(str1.equals(null))'抛出一个NullPointerException异常,要么返回false。所以,你永远不会写这个(除非null参数不是文字)。 – leonbloy 2010-05-13 20:52:54

+1

我同意这样做没什么意义,但是这并不妨碍它在某人的代码中出现。 – akf 2010-05-13 20:59:57

+0

是的,作为教学助手,我经常在学生代码中看到这种情况,这可能是该300级课程中第二常见的错误(#1忘记'实现序列化'!) – 2010-05-13 21:56:46

4

没有,

if (str1 == null) 

不能抛出一个空指针异常,因为没有指针被废弃。

的类似

if (obj1.getStr1() == null) 

可以抛出在于OBJ1的情况下的NPE == null,或者,

if (str1 == null && str1.length() == 0) 

将抛出NPE上str1.length()时STR1 == NULL 。 (在这种情况下,||运营商应该已被使用。)

你可以显示它的中断并包括堆栈跟踪的确切行吗?

3

如果您有字节码操作,例如在OSGi组件中,字段访问可以用代理的getter方法替换。如果在底层组件被丢弃后访问字段,则字段访问会抛出一个NPE,因为它已被替换为以下内容,并且thisObject设置为null。

if (thisObject.getStr1() == null) 

顺便说一句:我有一个与今天这个问题有关的错误。 :P

+0

,但是不应该在这行代码之前发生这种访问,考虑到代码正在检查一个针对null的方法参数,您的代理getter方法在调用方法之前是否已经使用过,因此在那里崩溃,而不是指示线? – 2010-05-13 21:50:33

+1

代码注入更改字节代码,而不是源代码。它不会插入新的代码行,因此当它报告该行出现故障时。 – 2010-05-14 06:23:17

相关问题