我正在研究try-catch块。在这里,我们通过blowup()抛出NullPoInterException,即使我们也可以分配
Exception e = new NullPointerException();
和blewit类再次是类型异常类。因此,我们投掷的例外必须被捕获在捕获块中,但事实并非如此。
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");
}
}
}
请帮助我清除其背后的概念。
NullPointerException
不是BlewIt
的子类。因此,捕获BlewIt
不会捕获NullPointerException
。
如果要捕获BlewIt
,则应在blowUp()
中进行throw new BlewIt ()
。
简单地将事情放置,当Blewit扩展异常时,Blewit成为异常的子类,它并不意味着它会捕获NullPoInterExcept。
static void blowUp() throws BlewIt {
throw new NullPointerException();
}
但是,由于NullPoInterException不是检查的例外,您的代码编译。
但是,当您以后在代码稍后将NullPointer异常投掷时,并尝试通过捕获块捕获它,就像预期的那样,它不会捕获它。
您正在投掷NullPointerException
,并且您的捕获块正在捕获BlewIt
,因此它直接转到finally
块,并使用NullPointerException
的堆栈痕迹打印无人例外。
您的捕获块只会捕获BlewIt
及其子类型的例外。
编辑
class BlewIt extends NullPointerException
这将使BlewIt
成为NullPointerException
的子类,反之亦然。因此,您仍然无法通过BlewIt
NullPointerException