有时碰巧我编写了一个代码来检查NullPointerException,如下所示,
if(str!=null)
{
doSomething();
}
并且null检查本身会抛出NUllPointerException。
如何解决。
编辑: 实际上这段代码是空指针,
Map params = new HashMap();
if(params != null && params.get("requestType"))
{
//some null safe code goes here
}
我后来才知道params.get()抛出空指针异常。
答案 0 :(得分:10)
你似乎在说:
if (str != null) {
doSomething();
}
在比较中抛出NullPointerException
。
不可能。所以我希望真正发生的事情之一是:
您误解了堆栈跟踪,并且NPE没有被扔到那里。
实际代码与说明性示例大不相同。
您没有执行您认为正在执行的代码。例如,您可能没有重新编译它......或者您可能正在执行.class
或.jar
文件的陈旧副本。
您设法严重混淆了IDE。 (有时你可能会从混乱的IDE中得到非常奇怪的行为......)
唯一的情况是,该代码可能会使NPE不是您正在做错的其他事物的假象,如果安装有损坏的Java(或IDE),或者您的硬件是否有问题。我认为这些解释基本上难以置信。
<强>更新强>
现在你说:
Map params = new HashMap();
if(params != null && params.get("requestType"))
{
//some null safe code goes here
}
在params.get
中抛出NPE。我不得不说这是胡说八道。
代码不会编译。 params.get
来电不会返回boolean
或可以自动转换为boolean
的内容。
如果我们忽略编译错误,那么线程限制的地图上的params.get
只能在params
为null
时抛出NPE。此地图是线程限制的,之前的检查确保params
不是null
。
我之前的结论是有道理的。这是不可能的。
提示:此可能是一个线程问题。如果您使用一个线程更新HashMap
并使用另一个线程读取它,并且您没有正确同步,则可能会出现间歇性NPE。
答案 1 :(得分: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");
}
}
}