throws Exception的作用是什么?

6

有人能解释一下 Java 中 throws Exception 的用途吗?这只是用来指示该方法将抛出指定的异常吗?调用该方法需要捕获指定的异常吗?

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

它与 throw 有什么不同?谢谢。


3
请阅读Java异常教程 - assylias
除非你要对它做一些有用的事情,否则不应该捕获异常。仅仅打印并假装它没有发生或忽略它通常是一个坏主意。通常将其传递给调用者是最好的方法。即使对于 main(String[]) 也可以使用 throws Exception - Peter Lawrey
6个回答

11

Java使用显式的异常处理——除了运行时异常(RuntimeException),每个抛出的异常(由该方法本身或者它调用的方法声明了throws)必须在方法签名中被处理或声明。

这种方式可以提供安全性,因为当你调用一个方法时,你知道可能会出现哪些错误,然后可以通过try/catch块进行本地处理,或作为你的方法签名的一部分声明。


3
“你清楚地知道哪些运行时错误可能会发生。” 是的,但这种措辞不太恰当,因为RuntimeExceptions和Errors正是不需要声明的内容。(我暂时想不到更好的术语了。) - Thilo
好的,那么这是一种指示调用方法可能出现异常的方式? - mee
@Thilo:是的,我也注意到了,这就是为什么我在回答的第一句话中记得指出RuntimeException问题的原因。如果有更好的术语建议,我很乐意进行编辑 :) - amit
1
@amit:顺便说一句,我试着重新措辞上面与Thilo的交流中最后一句话。如果你不喜欢,就恢复原样吧,但我认为这样更清晰明了。 - T.J. Crowder
@T.J.Crowder:对我来说看起来不错。我总是鼓励大家为了更好的措辞而编辑我的内容,因为我的信息页面明确说明了这一点,毕竟我不是以英语为母语的人。谢谢。 :) - amit

7
尽管@amit已经给出了非常好的答案,但我想补充一些内容。
因此,我们可以使用try-catch块来捕获异常,而不是使用throws?
我认为你问题的这个部分没有得到回答。实际上,你正在问是否应该定义方法对异常透明,还是捕获在方法内抛出的异常。
答案是取决于应用程序。通常有两种情况需要将异常捕获到方法中:
1. 您需要处理异常,所以您的流程取决于是否抛出异常。例如,如果您正在从文件读取,并且发生IO错误,则会尝试重新从文件读取。
2. 您不希望将应用程序特定层抛出的异常暴露给更高级别的层。在这种情况下,您可能会用try块包装您的代码,并使用其他层级异常包装抛出的异常:
try { // some code } catch(IOException e) { throw new ApplicationLevelException(e); }
在大多数其他情况下,您可能希望对异常透明,并在一个单一的点捕获所有异常,该点知道如何处理它们。例如显示面向客户的错误消息。

0

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


0
简而言之,如果您在try-catch块中使用特定的异常处理,那么您正在处理该异常。 如果您在方法上指定throws,则声明该方法可能会抛出此类异常(而不是在其内部处理它),并且由调用者负责处理该异常。

0

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

因此,在API方法中声明抛出异常并使用throws子句处理使用API的应用程序中的异常总是更好的选择。

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


0
如果你在一个方法中添加了throws,那么这个方法意味着它可能会向调用它的方法抛出一个Exception
例如:
public void method1() throws Exception {
    ...
    throw new Exception();
    ...
}

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

如果您没有告诉一个方法如何throwException,那么您必须使用trycatch来处理它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接