空指针检查抛出空指针异常。

6
有时候我会写下面这样的代码来检测NullPointerException:
if(str!=null)
{
    doSomething();
} 

并且空指针检查本身会抛出NullPointerException异常。

如何解决它。

编辑: 实际上,这段代码正在获取空指针。

Map params = new HashMap();
if(params != null && params.get("requestType"))
{
    //some null safe code goes here
}

我后来明白了,params.get() 会抛出空指针异常。

你能发布你的完整代码吗? - Anik Islam Abhi
1
你没有所谓的“检查NullPointerException”的代码,但是你有检查null的代码。这段代码本身不可能抛出NullPointerException异常,因此问题必须在你的代码中的其他地方,在你还没有发布到SO的地方。 - Erwin Bolwidt
1
那个检查没有抛出异常。也许你写了 if (str!=null) { } 或者 if (str.foobar() != null) { }。 - MeBigFatGuy
当不涉及对象操作时,如何抛出NullPointerException? - janasainik
2个回答

14
你似乎在说:
if (str != null) {
    doSomething();
}

在比较中抛出了一个 NullPointerException 异常。

这是不可能的。因此,我认为实际发生的情况可能是以下之一:

  • 您误解了堆栈跟踪,NPE 并不是在那里抛出的。

  • 实际代码与说明性示例大不相同。

  • 您没有执行您认为自己正在执行的代码。例如,您可能没有重新编译它......或者您可能正在执行一个.class.jar文件的旧副本。

  • 您已经严重混淆了您的 IDE。(有时,混淆的 IDE 可以产生非常奇怪的行为...)


只有在您安装的 Java (或 IDE) 损坏或您的硬件损坏时,该代码可能会产生 NPE,而不是您做错其他事情的产物。我认为这些解释基本上是不可信的。


更新

现在你说:

Map params = new HashMap();
if(params != null && params.get("requestType"))
{
    //some null safe code goes here
}

调用params.get会抛出NPE异常。我必须说这是无稽之谈。

  1. 代码无法编译。 params.get 调用不返回boolean或自动转换为boolean的内容。

  2. 如果我们忽略编译错误,则在线程限制的映射上对params.get进行操作只有在paramsnull时才会抛出NPE。该映射确实是受线程限制的,并且上一个检查确保了params不为null

我的先前结论仍然成立。这是不可能的。

提示:这可能是线程问题。如果您使用一个线程更新一个HashMap,并使用另一个线程读取它,而您没有正确同步,就有可能获得间歇性的NPE异常。


最近我一直在做一个支持项目,那个文件是JSP文件,而且脚本中的代码在类似上面的条件下会出现NPE错误,所以我提出了问题,谢谢回复。 - prsutar
我的结论是实际项目中的代码与你问题中的示例有很大不同。如果你展示错误的代码,我们恐怕无法给你有意义的答案。 - Stephen C

0
你有仔细检查过吗?你能给我解释一下场景吗?这是用Java写的吗? 如果是用Java写的,那么这里有一个样例代码可以正常工作,你可以交叉检查一下。 如果它是一个局部变量,也可以正常工作。
    class string 
    {
        static String str;

        public static void main(String[] args){
           if(str!=null){
               System.out.println("hi");
           }else{
               System.out.println("bye");
           }
        }

    } 

1
这与问题无关。问题是关于 str != null 是否会抛出异常。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接