Java 我们应该在方法中何时抛出异常或捕获异常?

Java 我们应该在方法中何时抛出异常或捕获异常?,java,exception,exception-handling,try-catch,Java,Exception,Exception Handling,Try Catch,我已经阅读了更多关于异常的内容,但我不确定在什么情况下我们应该抛出一个方法 public void fxml() throws IOException { // method body here } 或捕获方法中的异常 public void fxml() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml.fxml")); try

我已经阅读了更多关于异常的内容,但我不确定在什么情况下我们应该抛出一个方法

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);
            } 
}
从甲骨文的例子来看,它说

有时,代码捕捉可能发生在其中的异常是合适的。但是,在其他情况下,最好让调用堆栈更上层的方法处理异常。例如,如果将ListofNumber类作为类包的一部分提供,则可能无法预测包中所有用户的需求。在这种情况下,最好不要捕获异常,并允许调用堆栈更高的方法来处理它

所以我很好奇,这是否意味着我们可能不需要这个类/方法,如果我们不使用它,那么在这个方法中做一个try/catch就没有用了,所以我们“抛出”它以备以后使用

类本身似乎也“抛出异常”,以便以后使用。。。它只是一个层次的抛出,直到你最终可以使用它所有?在上面的教程中,后面几章是一章,叫做“链式异常”,这就是方法抛出的本质吗

我也读过这篇文章

但我发现它并没有完全解释我想知道的,然而我发现了这种兴趣

如果要捕获异常类型,则不需要抛出它,除非要重新抛出它。在您发布的示例中,开发人员应该做一个或另一个,而不是两个都做

通常,如果您不打算对异常执行任何操作,则不应捕获它

你能做的最危险的事情就是抓住一个异常而不处理它

我真的不知道他所说的“重新使用”是什么意思,除非他说的是扔掉这个方法,然后再抓住它

然后,他谈到如果你不打算使用它,就不会做任何异常的事情,所以,如果我们需要它,最好把它扔给以后使用

那么说它很危险?为什么会这样

因此,本质上,如果我们不知道是否要使用它,那么我们应该抛出它以便调用方法本身,或者如果我们知道它将被调用,无论发生什么,那么我们应该执行try/catch块

我还注意到,我的示例还基于IOException抛出一个RuntimeException。所以在某种意义上,你可以使用我们抛出的第一个方法,不管有什么异常,然后将它抛出到try或catch块中?catch块似乎更适合于“RuntimeException”或其他系统异常,但可能还有其他用例

想法


谢谢你的帮助

如果代码无法完成其工作(也称为“履行其契约”),则抛出异常。这可能是因为调用者向您传递了无效的输入,或者某些外部资源出现故障(例如丢失网络连接)

捕获一个异常,当下游有一个您可以以某种方式处理的预期问题时。例如,您可能会捕获指示网络问题的异常并重试该操作几次,或者您可能会向用户显示错误消息并询问下一步要做什么


如果下游代码可能抛出异常,但代码位于中间,不知道该怎么做,只需让异常移动到调用代码。 很多都取决于打电话者的期望。如果调用方依赖于方法调用的结果,则最好抛出/重新抛出异常,以便它们知道结果何时无效。这也将归结为该方法的控制量,例如,如果该方法加载配置文件,该方法是否有能力/控制影响程序的其余部分,或者它是否与程序的其余部分隔离/解耦?正如人们所预料的,这个问题,或者类似的问题,已。这与询问是否在方法签名中包含

抛出
部分不同。这样做将询问是否抛出已检查的异常。