Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java if(str1==null)when引发NullPointerException_Java_String_Nullpointerexception - Fatal编程技术网

Java if(str1==null)when引发NullPointerException

Java if(str1==null)when引发NullPointerException,java,string,nullpointerexception,Java,String,Nullpointerexception,在java中,以下行是否有可能(甚至0.01%)抛出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 } 事实上,我在代码中遇到了一些错误,它说方法中的exact

在java中,以下行是否有可能(甚至0.01%)抛出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
}
事实上,我在代码中遇到了一些错误,它说方法中的
exact
上一行抛出了java.lang.NullPointerException

if (str1 == null)  
不会引发NullPointerException

if(str1.equals(null)) 
确实有这种可能性

编辑:


如果堆栈跟踪引用了上面的行,那么很有可能您正在运行的代码与您正在查看的代码不匹配。如果在编译和部署类后对其进行了修改,从而导致行号不匹配,则可能会发生这种情况。

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

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

if (foo.str1 == null)
如果
foo
为空,则会得到一个NullPointerException。

if (str1 == null)
无法引发空指针异常,因为没有取消引用指针

相似的

if (obj1.getStr1() == null)
在obj1==null的情况下可以抛出NPE,或者

if (str1 == null && str1.length() == 0)
当str1==null时,将在str1.length()上抛出NPE。(在这种情况下,应使用
|
运算符。)


您能显示它中断的确切行并包括堆栈跟踪吗?

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

if (thisObject.getStr1() == null)

顺便说一句:今天我遇到了一个与这个问题相关的错误P

实际上,
如果(str1.equals(null))
抛出NullPointerException,或者返回false。所以,你永远不会想写那行代码(除非空参数不是文字)。我同意这行代码没有多大意义,但这并不妨碍它出现在某人的代码中。是的,作为一名助教,我经常在学生代码中看到这一点,这可能是300级课程中第二个最常见的错误(#1忘记了
实现序列化的
!)“类似的行”不剪切。为什么不显示精确的行?问题仍然与答案不符,反之亦然。我看不出接受的答案如何回答现在编辑的问题,并带有
精确的
行。但是,考虑到代码正在检查方法参数是否为空,此访问不应该发生在这行代码之前吗ldn您的代理getter方法不是在调用该方法之前就被使用过,因此在那里崩溃,而不是在指定的行上吗?代码注入会更改字节代码,而不是源代码。它不会插入新的代码行,所以当它报告失败时,它会在该行上。我帮助很多人调试。有时他们会询问/暗示询问我为什么不同有时他们很能干,只是很高兴能越过路障。但如果他们给了我一个机会(或者我已经厌倦了帮助他们),我会指出我使用的公理:如果你知道的一切都告诉你你看到的行为不可能是对的,那么“你知道的一切”不可能是对的。系统地挑战你所有的假设,你会更快地发现你的问题。如果你的复制案例没有复制错误,那就不是复制案例。复制更多代码。改进模拟。深入研究。