Java 当try block中写入TROW new Error()时,为什么不执行catch block。它只在最后执行。后面的代码也不执行
下面的示例是一个程序,其中调用了try block defectedCode()方法,所以为什么只有输出显示为C,并带有“Exception in thread”main“java.lang.Error”Java 当try block中写入TROW new Error()时,为什么不执行catch block。它只在最后执行。后面的代码也不执行,java,exception-handling,Java,Exception Handling,下面的示例是一个程序,其中调用了try block defectedCode()方法,所以为什么只有输出显示为C,并带有“Exception in thread”main“java.lang.Error” 因为Error不是Exception,所以catch块不监视它 使用throw new Exception()造成这种情况的主要原因是您抛出了一个错误,但捕获了一个异常。 如果你看一下可丢弃的层次结构,这一点是清楚的。您无法捕获带有异常的错误。因此,不会输入catch块,最终将调用它 试试这个
因为
Error
不是Exception
,所以catch块不监视它
使用
throw new Exception()
造成这种情况的主要原因是您抛出了一个错误,但捕获了一个异常。
如果你看一下可丢弃的层次结构,这一点是清楚的。您无法捕获带有异常的错误。因此,不会输入catch块,最终将调用它
试试这个:
try{
defectedCode();
System.out.println("A");
}catch(Throwable e){
System.out.println("B");
}finally{
System.out.println("C");
}
一个
错误
不是一个异常
可丢弃对象的基类是throwable
错误和异常是两种不同类型的一次性事件。然而,错误通常不应该被捕获,这就是为什么人们使用
catch(Exception e)
来捕获他们应该捕获的所有异常
显然,由于
Error
不是Exception
的子类,它不受catch(Exception e)
的影响,因此它不会被捕获<代码>最后始终被执行,无论是否捕获了可丢弃文件。您不应该捕获错误
“错误”表示一个合理的应用程序不应该试图捕捉的严重问题
当
异常“表示合理的应用程序可能希望捕获的条件。”
说到你的代码,你抛出了一个错误,捕获了一个异常,现在很明显它们是两个离散的实体
错误以及RuntimeException&它们的子类是未检查的异常。所有其他异常类都是选中的异常
检查异常通常是程序可以从中恢复的异常&以编程方式从此类异常中恢复可能是个好主意。示例包括FileNotFoundException、ParseException等。程序员应该使用try-catch块检查这些异常,或者将其抛出回调用方
另一方面,我们有未经检查的例外情况。如果一切正常,这些例外可能不会发生,但它们确实发生了。示例包括ArrayIndexOutOfBoundException、ClassCastException等。许多应用程序将对RuntimeException及其子类使用try-catch或throws子句,但从语言角度来看,不需要这样做。请注意,从RuntimeException恢复通常是可能的,但是设计类/异常的人认为最终程序员没有必要检查此类异常
错误也是未检查的异常&程序员不需要对这些错误执行任何操作。事实上,对错误使用try-catch子句是个坏主意。大多数情况下,从错误中恢复是不可能的&应该允许程序终止。示例包括OutOfMemoryError、StackOverflowerError等
请注意,尽管错误是未检查的异常,但我们不应该尝试处理它们,但在代码中处理运行时异常(也是未检查的异常)是可以的。检查过的异常应该由代码处理。虽然从道德上讲,您不应该捕获错误,但您仍然可以将其作为可丢弃对象捕获
Exception in thread "main" java.lang.Error
C
at ExceptionTest.defectedCode(ExceptionTest.java:15)
at ExceptionTest.main(ExceptionTest.java:21)
Java Result: 1
try{
defectedCode();
System.out.println("A");
}catch(Throwable e){
System.out.println("B");
}finally{
System.out.println("C");
}