Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当try block中写入TROW new Error()时,为什么不执行catch block。它只在最后执行。后面的代码也不执行_Java_Exception Handling - Fatal编程技术网

Java 当try block中写入TROW new Error()时,为什么不执行catch block。它只在最后执行。后面的代码也不执行

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块,最终将调用它 试试这个

下面的示例是一个程序,其中调用了try block defectedCode()方法,所以为什么只有输出显示为C,并带有“Exception in thread”main“java.lang.Error”


因为
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");
    }