示例下面的程序,其中在try块中调用了defectedCode()方法,那么为什么只有输出只显示C"线程中的异常" main" java.lang.Error的"
public class ExceptionTest {
public static void defectedCode(){
throw new Error();
}
public static void main(String args[]){
try{
defectedCode();
System.out.println("A");
}catch(Exception e){
System.out.println("B");
}finally{
System.out.println("C");
}
System.out.print("D");
}
}
Exception in thread "main" java.lang.Error
C
at ExceptionTest.defectedCode(ExceptionTest.java:15)
at ExceptionTest.main(ExceptionTest.java:21)
Java Result: 1
答案 0 :(得分:7)
这样做的主要原因是你抛出一个错误,但是你遇到了异常。 如果你看一下Throwable层次结构,那么这一点很清楚。您无法捕获异常错误。因此,没有输入catch块,最后将被调用。
试试这个:
try{
defectedCode();
System.out.println("A");
}catch(Throwable e){
System.out.println("B");
}finally{
System.out.println("C");
}
答案 1 :(得分:2)
因为Error
不是Exception
,所以catch块没有监控它
使用throw new Exception()
答案 2 :(得分:1)
你不应该发现错误
错误"表示合理的应用程序不应该试图捕获的严重问题。"
,而
异常"表示合理的应用程序可能想要捕获的条件。"
谈论你的代码,你犯了错误并发现异常,现在必须明白它们是2个独立的实体
RuntimeException&他们的子类是未经检查的异常。所有其他异常类都是经过检查的异常。
检查的例外通常是程序可以恢复的例外情况。以编程方式从这些异常中恢复可能是个好主意。示例包括FileNotFoundException,ParseException等。程序员应该使用try-catch块检查这些异常,或将其抛回调用者
另一方面,我们有未选中的例外情况。这些是如果一切都井然有序可能不会发生的例外情况,但确实会发生。示例包括ArrayIndexOutOfBoundException,ClassCastException等。许多应用程序将对RuntimeExceptions使用try-catch或throws子句。他们的子类,但从语言的角度来看,不需要这样做。请注意,通常可以从RuntimeException中恢复,但设计类/异常的人认为最终程序员不必检查此类异常。
错误也是未经检查的异常&程序员不需要对这些做任何事情。实际上,对于错误使用try-catch子句是个坏主意。大多数情况下,从错误中恢复是不可能的。该程序应该被允许终止。示例包括OutOfMemoryError,StackOverflowError等
请注意,尽管错误是未经检查的异常,但我们不应尝试处理它们,但可以在代码中处理RuntimeExceptions(也是未经检查的异常)。检查的异常应该由代码处理。
答案 3 :(得分:0)
Error
不是Exception
。
可投掷对象的基类是Throwable
错误和异常是两种不同类型的throwable。但是,通常不应该捕获错误,这就是人们使用catch(Exception e)
基本上捕获它们应该捕获的所有异常的原因。
显然,由于Error
不是Exception
的子类,因此它不受catch(Exception e)
的影响,因此它不会被捕获。始终执行finally
,无论是否已经捕获了throwable。
答案 4 :(得分:0)
虽然从道德上说你不应该抓错,你仍然可以把它当作一个Throwable Object。