是不是在try块中捕获的未经检查的exception在Java中检查了exception?

有人告诉我,在Java中,未经检查的exception可以在try块中捕获,但如果它被捕获,是不是称为已检查exception?

未经检查的exception是不需要在trycatch块中捕获的exception。 未经检查的exception是RuntimeExceptionError类的子类。

已检查的exception是需要在trycatch块中捕获的exception。

已检查和未检查的exception的定义可以在第11.2节: Java语言规范 的exception的编译时检查中找到:

未经检查的exception类是RuntimeException类及其子类,以及类Error及其子类。 所有其他exception类都是已检查的exception类。

仅仅因为在catch块中捕获未经检查的exception不会使其成为已检查的exception – 它只是意味着捕获了未经检查的exception,并在catch块中处理。

可以catch未经检查的exception,然后throw一个新的已检查exception,因此调用该方法的任何方法都可能发生未经检查的exception,并强制调用它来处理某种exception的方法。

例如,在向Integer.parseInt方法处理一些不可解析的String时可以抛出的NumberFormatException是一个未经检查的exception,因此不需要捕获它。 但是,调用该方法的方法可能希望其调用者正确处理这样的问题,因此它可能会抛出另一个被检查的exception(不是RuntimeException的子类)。

 public int getIntegerFromInput(String s) throws BadInputException { int i = 0; try { i = Integer.parseInt(s); catch (NumberFormatException e) { throw new BadInputException(); } return i; } 

在上面的示例中,在trycatch块中捕获NumberFormatException ,并BadInputException新的BadInputException (旨在作为已检查的exception)。

getIntegerFromInput方法的任何调用者都将被强制捕获BadInputException ,并被迫处理错误的输入。 如果不捕获和处理NumberFormatException则此方法的任何调用者都必须正确处理exception。

(另外,应该注意的是,吃exception并做一些不重要的事情并不是一种好的做法 – 处理可以执行有意义的exception处理的exception。)

来自Java教程:

  • 课程:例外
    • 捕获或指定要求 – 讨论已检查的exception。
    • 链式exception – 捕获exception并抛出新exception的做法,如上例所示。
    • 未经检查的例外 – 争议

不,它不会因为它被捕获而被称为已检查的exception。 可以编写一个catch块来捕获任何类型的exception或错误。 已检查的exception是受Catch或Specify Requirement约束的exception,这意味着您需要捕获它们或声明您的方法可能抛出它们。 您可以将“检查”一词视为编译器将检查以确保您遵守catch或指定要求的含义。 错误和RuntimeExceptions被称为未经检查的exception,因为编译器不对它们强制执行此要求。

我认为区别在于编译器将标记未捕获的已检查exception和抛出已检查exception的方法,但在编译时不会在方法签名中声明它们。

未经检查的例外不需要声明或捕获,但两者都不被禁止。 编译器只是不将它们识别为错误。