【发布时间】:2015-10-14 23:48:32
【问题描述】:
我一直在阅读有关异常的更多信息,但我不确定在什么情况下我们应该抛出一个方法
public void fxml() throws IOException
{
// method body here
}
或在方法中捕获异常
public void fxml()
{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml.fxml"));
try
{
fxmlLoader.load();
}
catch (IOException exception)
{
throw new RuntimeException(exception);
}
}
从 Oracle 的例子来看
有时,代码可以捕获其中可能发生的异常。然而,在其他情况下,最好让调用堆栈更靠前的方法处理异常。例如,如果您将 ListOfNumbers 类作为类包的一部分提供,您可能无法预料到包中所有用户的需求。在这种情况下,最好不要捕获异常,并允许调用堆栈更靠前的方法来处理它。
https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html
所以我很好奇这是不是说我们可能不需要类/方法,并且通过在这个方法中执行 try/catch 如果我们不使用它就没有任何目的,所以我们“抛出它”供以后使用?
似乎类本身也“抛出异常”以便以后使用......它只是一个抛出的层次结构,直到你最终可以使用它?在上面的教程中,后面几章是一个叫做“链式异常”的章节,这本质上是怎么回事,用于稍后使用的方法 throws?
我也读过这个帖子When to use throws in a Java method declaration?
但我发现它并没有完全解释我想知道的内容,但是我发现了这种兴趣
如果你正在捕获一个异常类型,你不需要抛出它,除非你打算重新抛出它。在您发布的示例中,开发人员应该做一个或另一个,而不是两者。
通常,如果您不打算对异常执行任何操作,则不应捕获它。
你能做的最危险的事情就是捕获一个异常而不用它做任何事情。
我不太确定他所说的“重新抛出”它是什么意思,除非他说的是抛出该方法并稍后再捕获它?
然后他说如果你不打算使用它,就不要做任何事情,所以如果我们需要它,似乎最好把它扔掉以备后用?
然后说它很危险?这是为什么呢?
所以本质上,如果我们不知道是否要使用它,那么我们应该抛出它以便可以调用方法本身,或者如果我们知道它将被调用,无论如何,那么我们应该做一个 try/catch 块?
我还注意到,我的示例还基于 IOException 引发了 RuntimeException。所以从某种意义上说,你可以采用我们抛出的第一个方法,不管有什么异常,然后把它扔到 try 或 catch 块中?似乎 catch 块更适合“RuntimeException”或其他系统异常之一,但也许还有其他用例?
想法?
感谢您的帮助!
【问题讨论】:
-
很多都取决于调用者的期望。如果调用者依赖于方法调用的结果,那么抛出/重新抛出异常将是有利的,以便他们知道结果何时失效。这也将归结为该方法具有的控制量,例如,如果该方法加载配置文件,该方法是否具有影响程序其余部分的能力/控制,或者它是否与程序的其余部分?
-
正如人们所料,这个问题,或者类似的问题,一直是asked many times on this site。
-
这与询问方法签名中是否有
throws部分不同。这样做会询问是否抛出 checked 异常。
标签: java exception exception-handling try-catch