2010-12-08 57 views
73

所以我认为我对Java中的异常处理有了很好的基本理解,但是最近我正在阅读一些代码,这些代码给了我一些困惑和疑惑。我说我想在这里讨论的主要疑问是,当一个人应该使用抛出类似以下的Java方法声明:何时在Java方法声明中使用throws?

public void method() throws SomeException 
    { 
     // method body here 
    } 

从阅读一些类似的帖子我推测,抛出作为一种宣言SomeException可能在执行该方法期间被抛出。

我的困惑来自于一些代码,看起来像这样:

 public void method() throws IOException 
    { 
      try 
      { 
       BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
      } 
      catch(IOException e) 
      { 
       System.out.println(e.getMessage()); 
      } 
    }

是否有任何理由,你会想用在这个例子中抛出?看起来,如果你只是在做基本的异常处理,比如IOException,那么你只需要try/catch块就可以了。

回答

71

如果您正在捕捉异常类型,则不需要抛出异常,除非要重新抛出它。在你发布的例子中,开发者应该完成这个或者另一个,而不是两个。

通常情况下,如果你不打算对异常做任何事情,你不应该抓住它。

你可以做的最危险的事情是捕捉一个异常,而不是做任何事情。

,在适当时候抛出异常的一个很好的讨论,在这里

When to throw an exception?

+1

是否还应该在方法签名中用'throws'声明未经检查的异常,还是仅仅使用'throws'来检查异常? – Cody 2014-04-01 18:31:23

2

你是正确的,在该示例中,throws是多余的。这可能是由于之前的一些实现而留下的 - 也许这个异常最初是抛出的,而不是捕获到catch块。

1

在您给出的示例中,该方法永远不会抛出IOException,因此声明是错误的(但是有效)。我的猜测是原始方法抛出了IOException,但它被更新以处理内部的异常,但声明没有改变。

18

如果方法抛出检查的异常,则只需在方法中包含一个throws子句。如果该方法抛出运行时异常,则不需要这样做。

看到这里的一些背景上选中VS unchecked异常:http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

如果方法捕获异常,并处理它在内部(如在你的第二个例子),那么就没有必要包含throws子句。

7

您查看的代码并不理想。您应该:

  1. 捕获异常并处理它; 在这种情况下throws是 不必要的。

  2. 删除try/catch;在这种情况下, 的例外情况将由 调用方法处理。

  3. 捕获异常,可能 执行一些动作,然后再次抛出

1

您发布的代码是错误的,应该如果捕获特定抛出一个异常除外(不只是消息)异常,以处理IOException但抛出未捕获的异常。

喜欢的东西:

public void method() throws Exception{ 
    try{ 
      BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
    }catch(IOException e){ 
      System.out.println(e.getMessage()); 
    } 
} 

public void method(){ 
    try{ 
      BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
    }catch(IOException e){ 
      System.out.println("Catching IOException"); 
      System.out.println(e.getMessage()); 
    }catch(Exception e){ 
      System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc."); 
      System.out.println(e.getMessage()); 
    } 

}

0

这不是一个答案,而是一个评论,但我不能写一个格式化代码中的注释,所以这里是评论。

比方说有

public static void main(String[] args) { 
    try { 
    // do nothing or throw a RuntimeException 
    throw new RuntimeException("test"); 
    } catch (Exception e) { 
    System.out.println(e.getMessage()); 
    throw e; 
    } 
} 

输出是

test 
Exception in thread "main" java.lang.RuntimeException: test 
    at MyClass.main(MyClass.java:10) 

这种方法不声明任何 “抛出” 的例外,但他们抛出! 诀窍是抛出的异常是RuntimeExceptions(未检查),不需要在方法中声明。 该方法的读者有点误导,因为她看到的只是一个“扔e”;声明,但没有声明抛出异常

现在,如果我们有

public static void main(String[] args) throws Exception { 
    try { 
    throw new Exception("test"); 
    } catch (Exception e) { 
    System.out.println(e.getMessage()); 
    throw e; 
    } 
} 

我们必须声明“抛出”的方法例外,否则我们得到一个编译错误。