什么是抛出异常

问题描述:

有人可以解释我在java中抛出异常的用法是什么? 它只是用来表示该方法将抛出指定的异常?调用方法需要捕获指定的异常?什么是抛出异常

因此,而不是抛出,我们可以使用try-catch块来捕获异常?

它与throw有何不同? 感谢

+3

请阅读[上异常的Java教程](http://docs.oracle.com/javase/tutorial/essential/exceptions/)。 – assylias 2012-04-17 08:31:08

+0

除非你要做一些有用的事情,否则你不应该捕获异常。只是印刷它,假装它没有发生或忽略它通常是一个坏主意。通常将它传递给调用者是最好的应用。 eveen for'main(String [])'你可以有'抛出Exception' – 2012-04-17 08:32:24

Java使用明确的异常处理 - 除的RuntimeException S,每个异常抛出[由该方法本身,或者调用方法声明它throws吧] - 必须处理或方法签名中声明。

它允许安全性,因为当你调用你确切地知道可能发生的错误的方法,然后你就可以在本地与try/catch块处理,或声明为方法签名的一部分。

+3

+1“你确切地知道哪些运行时错误可能发生”。是的,但不幸的措辞,因为RuntimeExceptions和错误只是不需要声明。 (虽然没有更好的术语,尽管如此)。 – Thilo 2012-04-17 08:28:58

+0

好的,谢谢,所以它是一种表明这种异常可能发生的调用方法? – mee 2012-04-17 08:30:21

+0

@Thilo:是的,我也注意到了这一点,这就是为什么我记得在答案的第一句中指出RuntimeException问题的原因。我会很高兴编辑,如果建议更好的术语:) – amit 2012-04-17 08:30:22

throws关键字指示该方法可能抛出异常。
当你认为调用者想要做他自己的异常处理时,你应该使用它,否则你应该使用try-catch块并且在catch块中返回一个指定的错误值,如indexOf()(来自Array)返回-1而不是抛出异常。

简而言之,如果您对特定异常使用try-catch块,那么您正在处理异常。 如果您在方法上指定了throws,那么您声明该方法可以抛出这样的异常(并且不在其内部处理它),并且它成为调用者处理该异常的责任。

+0

好吧,我明白了......谢谢! – mee 2012-04-17 08:39:50

如果添加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/

虽然@amit已经给了很好的答案,我只想补充一些东西。

因此,而不是抛出,我们可以使用try-catch块来捕获异常?

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

答案是它取决于您的应用程序。 通常有2种情况,当你想要捕捉例外的方法。

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

    尝试{// 一些代码 }赶上(IOException异常E){ 抛出新ApplicationLevelException(E); }

在你可能会想是透明的例外和捕获所有异常在知道与他们做一个单点其他大多数情况下。例如显示面向客户的错误消息。

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

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

使用try-catch块是最后一个选项!;)