我正在研究try-catch块。 这里我们通过blowup()抛出NullPointerException ,即使我们可以分配
Exception e = new NullPointerException();
BlewIt类再次是一个Exception类。 所以我们抛出的异常必须在catch块中捕获,但它没有。
class BlewIt extends Exception {
BlewIt() { }
BlewIt(String s) { super(s); }
}
class Test {
static void blowUp() throws BlewIt {
throw new NullPointerException();
}
public static void main(String[] args) {
try {
blowUp();
} catch (BlewIt b) {
System.out.println("Caught BlewIt");
} finally {
System.out.println("Uncaught Exception");
}
}
}
输出:
Uncaught Exception
Exception in thread "main" java.lang.NullPointerException
at Test.blowUp(Test.java:7)
at Test.main(Test.java:11)
但是如果你编写这样的代码,它运行正常:
try {
blowUp();
} catch (Exception b) {
System.out.println("Caught BlewIt");
} finally {
System.out.println("Uncaught Exception");
}
现在BlewIt是NullPointerException类型,但我仍然得到相同的输出。
class BlewIt extends NullPointerException {
BlewIt() {
}
BlewIt(String s) {
super(s);
}
}
class Test {
static void blowUp() throws BlewIt {
throw new NullPointerException();
}
public static void main(String[] args) {
Exception e = new NullPointerException();
try {
blowUp();
} catch (BlewIt b) {
System.out.println("Caught BlewIt");
} finally {
System.out.println("Uncaught Exception");
}
}
}
请帮我解决背后的概念。
答案 0 :(得分:3)
NullPointerException
不是BlewIt
的子类。因此,抓住BlewIt
并不会抓住NullPointerException
。
如果您想抓住BlewIt
,则应throw new BlewIt ()
blowUp()
{/ 1}}。
答案 1 :(得分:1)
您正在抛出NullPointerException
并且您的catch块正在捕获BlewIt
,因此它会直接转到finally
阻止并打印未捕获的异常,堆栈跟踪为NullPointerException
。
您的catch块只会捕获类型BlewIt
及其子类型的异常。
修改强>
class BlewIt extends NullPointerException
这会使BlewIt
成为NullPointerException
的子类,反之亦然。因此,您仍然无法通过NullPointerException
BlewIt
答案 2 :(得分:1)
简单地说,当BlewIt扩展Exception时,BlewIt成为异常的子类,并不意味着它会捕获NullPointerException。
static void blowUp() throws BlewIt {
throw new NullPointerException();
}
但是,由于NullPointerException不是一个已检查的异常,因此您的代码将被编译。
但是当您稍后在代码中抛出NullPointer异常并尝试通过catch块捕获它时,正如预期的那样它无法捕获它。