Java 检查异常
Java checked exceptions
我正在尝试了解 Java 中的已检查异常并进行以下查询。
以下是否正确:如果方法有可能抛出任何类型的已检查异常,则该异常必须是
- 使用
throws
关键字声明,或
- 通过相应的方法捕获。
如果以上是正确的,这是否意味着我需要了解 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 并使上述程序无编译错误。
我正在尝试了解 Java 中的已检查异常并进行以下查询。
以下是否正确:如果方法有可能抛出任何类型的已检查异常,则该异常必须是
- 使用
throws
关键字声明,或 - 通过相应的方法捕获。
如果以上是正确的,这是否意味着我需要了解 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 并使上述程序无编译错误。