运行时:
public class WhatTheShoot {
public static void main(String args[]){
try {
throw null;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
}
}
Run Code Online (Sandbox Code Playgroud)
回应是:
true
false
Run Code Online (Sandbox Code Playgroud)
这对我来说相当惊人.我原本以为这会造成编译时错误.
为什么我可以在Java中抛出null,为什么要将它转换为NullPointerException呢?
(实际上,我不知道它是否是"向上",因为我扔的是null)
除了一个非常愚蠢的面试问题(请不要在面试中问这个)我看不出任何理由throw null.也许你想被解雇,但那是......我的意思是,为什么还有人throw null呢?
有趣的事实 IntelliJ IDEA 12告诉我,我的行e instanceof NullPointerException总是假的.这根本不是真的.
class ThrowNull {
public static void main(String[] args) {
throw null;
}
}
Run Code Online (Sandbox Code Playgroud)
我们知道throw的规则是throw ThrowableInstance;,ThrowableInstance必须是Throwable类型的对象或Throwable的子类.
简单类型(如int或char)以及非Throwable类(如String和Object)不能用作异常.null是一个特殊的Java文字,表示一个空值.
那么为什么要throw null;编译这段代码呢?
我遇到了一个相当奇怪的小问题.
在下面的代码中我无法理解怎么e可能null;
try
{
//Some Code here
}
catch (Exception e)
{
//Here e is null
}
Run Code Online (Sandbox Code Playgroud)
据我所知,throw null将转换为throw new NullReferenceException().
问题似乎与多线程有关,因为删除另一个线程似乎也解决了它.或者至少我在上面的代码在新线程中运行时才看到这个.整个程序使用很多线程,有点复杂.
无论如何我的问题是,怎么可能e是null? - 希望答案可以帮助找到这个问题的根源.
编辑 我发现它,因为它在catch语句中引起了NullReferenceException,并且使用调试器我看到同样的事情.
编辑2 第二天打开VisualStudio再次尝试,没有代码更改,现在相同的口号被"调用",但这次e不是null.看起来这是一个VS故障.