Java 检查异常

Java checked exceptions

我正在尝试了解 Java 中的已检查异常并进行以下查询。

以下是否正确:如果方法有可能抛出任何类型的已检查异常,则该异常必须是

  1. 使用 throws 关键字声明,或
  2. 通过相应的方法捕获。

如果以上是正确的,这是否意味着我需要了解 Java 中内置的每个检查异常,以便我知道我的方法是否有可能抛出该异常?或者我应该尝试编译我的代码,然后根据编译时错误修改我的代码?

If the above is correct, does this mean that I need to understand every single checked exception that is built in to Java [...]?

是的,你的陈述是正确的,但没有人期望你在编程时知道所有潜在的检查异常。如果手头有编译器,或者更好的是 IDE,则不必这样做。

要么按照问题中的建议在编译器输出和代码之间来回切换,要么安装一个 IDE,例如 Eclipse,如果您违反规则,它会直接通知您:

does this mean that I need to understand every single checked exception that is built in to Java

我假设您正在使用一些 IDE(例如 Eclipse)- 如果没有,您应该尽快获得一个。

然后,IDE 几乎连续编译代码,所以当出现问题时,您会在它附近看到一条红色下划线,以及一个工具提示气泡,告诉您哪里出了问题 - 例如 "Missing throws" .

因此,你的第二个假设基本正确,只是幕后发生的:

Or should I just attempt to compile my code and then amend my code based on the compile-time errors?

所以不,你不需要了解所有异常。

此外,所有已检查的异常都扩展了 Exception,因此如果您有权访问源代码,则可以检查它们基于什么。非检查异常扩展 RuntimeException.

经验法则:如果是I/O,通常会检查。这是您会遇到的最常见的异常类型。

whenever you use a method (whether your own or In-built) if you closely follow its method signature, if the method throws some exception you need to throw/handle it explicitly in your code

这样你就不需要记住所有的异常,你会知道在什么地方处理哪些异常。

为了让生活更轻松,使用一些 IDE 比如 eclipse

希望对您有所帮助!

祝你好运!

If the above is correct

这是...

[...] does this mean that I need to understand every single checked exception that is built in to Java so that I know whether my method will have the potential to generate that exception? Or should I just attempt to compile my code and then amend my code based on the compile-time errors?

使用 IDE!你不需要对他们全部都了如指掌。

想要检查的是层次结构(即检查 javadoc!这应该是巴甫洛夫反射);由于异常是 类,它们相互继承,例如,FileSystemException 是 java.nio.file 的合成异常,表示文件系统相关问题,它继承了 IOException。想特殊对待的话,在IOException之前赶上

作为一般规则,首先捕获更具体的异常

此外,请勿捕捉 Exception。绝不。问题是 RuntimeException,它是 unchecked 异常的基础异常,继承了 Exception,这意味着如果你捕捉到 Exception,你就会捕捉到所有未检查的例外。你想重新抛出未经检查的:

try {
    something();
} catch (RuntimeException unchecked) {
    throw unchecked;
} catch (Exception e) {
    // deal with e
}

是的,你需要知道每一个异常..但是如果你知道那个异常的超级class而不是你不需要知道它的子class......例如.FileReader 抛出一个名为 FileNotFoundException 的异常 由于 FileNotFoundException 是 IOException 的子class,我们可以只在抛出列表中指定 IOException 并使上述程序无编译错误。