bha*_*ral 308 java exception-handling nullpointerexception
运行时:
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
总是假的.这根本不是真的.
Lou*_*man 411
看起来它不是null
被视为一个NullPointerException
,而是试图throw null
自己的行为抛出一个NullPointerException
.
换句话说,throw
检查它的参数是非空的,如果它是null,它会抛出一个NullPointerException
.
JLS 14.18 指定了这种行为:
如果表达式的评估正常完成,产生一个空值,则创建类NullPointerException的实例V'并抛出而不是null.然后throw语句突然完成,原因是值为V'的throw.
NIN*_*OOP 95
为什么它会将它转发为NullPointerException?
根据JLS 14.18:
throw语句首先评估Expression.如果表达式的评估由于某种原因突然完成,则抛出因此原因突然完成.如果表达式的评估正常完成,产生非空值V,则throw语句突然完成,原因是值为V的throw.如果Expression的评估正常完成,产生空值,则实例V'创建并抛出NullPointerException类,而不是null.然后throw语句突然完成,原因是值为V'的throw.
为什么我可以在java中抛出null?
您可以抛出类型的对象,Throwable
因为它null
是一个有效的引用Throwable
,编译器允许它.
尽管null可分配给每个引用类型,但null的类型本身不是引用类型.我们的意图是将throw语句中的表达式作为引用类型的要求从第三版JLS中删除,但该更改实际上从未实际进入已发布的版本.因此,这是我在SE 5中介绍的javac编译器错误.
Nic*_*tch 17
以这种方式思考它会使其更加明显:
try {
Exception foo = null;
if(false) {
foo = new FileNotFoundException();
} // Oops, forgot to set foo for the true case..
throw foo;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26914 次 |
最近记录: |