5

有人可以解释一下 java 中 throws Exception 的用途吗?它只是用来表示该方法会抛出指定的异常吗?调用方法需要捕获指定的异常吗?

那么我们可以使用 try-catch 块来捕获异常而不是 throws 吗?

它与投掷有何不同?谢谢

4

6 回答 6

11

Java 使用显式异常处理——除了RuntimeExceptions,每个抛出的异常 [由方法本身,或者它调用的方法声明它throws]——必须在方法签名中处理或声明。

它提供了安全性,因为当您调用一个方法时,您确切地知道可能发生哪些错误,然后您可以使用try/catch块在本地处理这些错误,或者将其声明为方法签名的一部分。

于 2012-04-17T08:26:41.983 回答
7

尽管@amit 已经给出了很好的答案,但我只想添加一些东西。

那么我们可以使用 try-catch 块来捕获异常而不是 throws 吗?

我认为你的这部分问题没有得到回答。实际上,您是在询问是否应该为异常定义“透明”的方法,或者捕获方法中抛出的异常。

答案是这取决于您的应用程序。通常有 2 种情况需要在方法中捕获异常。

  1. 您与异常有关,因此您的流程取决于抛出异常的事实。例如,如果您正在读取文件并且发生 IO 错误,则您正在尝试再次从文件中读取。
  2. 您不希望将在应用程序的特定层上引发的异常暴露给更高级别的层。在这种情况下,您可能会用 try 块包装您的代码,并用其他级别的异常包装抛出的异常:

    try { // 一些代码 } catch(IOException e) { throw new ApplicationLevelException(e); }

在大多数其他情况下,您可能希望对异常透明并在一个知道如何处理它们的单个点上捕获所有异常。例如显示面向客户的错误消息。

于 2012-04-17T08:36:11.227 回答
0

关键字表示该throws方法可以抛出异常。
当您认为调用者想要进行自己的异常处理时,您应该使用它,否则您应该使用 try-catch 块并在 catch 块中返回指定的错误值,例如indexOf()(从数组)返回 -1 而不是抛出一个例外。

于 2012-04-17T08:30:04.097 回答
0

简而言之,如果您对特定异常使用 try-catch 块,则您正在处理该异常。如果您在方法上指定 throws,则表示该方法可以抛出此类异常(而不是在其自身内部处理它),并且调用者有责任处理该异常。

于 2012-04-17T08:31:58.473 回答
0

如果你添加throws到一个方法,这意味着这个方法可以Exception向调用它的方法抛出一个。

例如:

public void method1() throws Exception {
    ...
    throw new Exception();
    ...
}

public void method2() {
    try {
        method1();
    catch(Exception e) {
        ...
    }
}

如果您不告诉您必须使用和处理throw的方法。Exceptiontrycatch

有关异常处理的更多信息,请参阅文档: http ://docs.oracle.com/javase/tutorial/essential/exceptions/

于 2012-04-17T08:34:58.650 回答
0

虽然已经给出了正确的答案,但我想补充一点,每当使用 try-catch 块时,都会创建一个新线程来处理异常。当在主线程和 try-catch 块线程中执行的活动导致任何冲突时,这有时可能会导致问题。

因此,最好使用 throws 子句声明您的 API 方法以引发异常,并在使用您的 API 的应用程序中处理异常。

使用 try-catch 块是最后的选择!;)

于 2012-04-17T11:29:10.790 回答