当抛出新的Error()写在try块中为什么catch块没有被执行。最后只进入.Latter代码也没有被执行

时间:2014-08-30 11:32:06

标签: java exception-handling

示例下面的程序,其中在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

5 个答案:

答案 0 :(得分:7)

这样做的主要原因是你抛出一个错误,但是你遇到了异常。 如果你看一下Throwable层次结构,那么这一点很清楚。您无法捕获异常错误。因此,没有输入catch块,最后将被调用。

试试这个:

    try{
        defectedCode();
        System.out.println("A");

    }catch(Throwable e){

        System.out.println("B");

    }finally{

        System.out.println("C");
    }

enter image description here

答案 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。