什么时候在Java方法声明中使用throws?

所以我认为我对Java中的exception处理有了很好的基本理解,但最近我正在阅读一些代码,这给我一些困惑和疑惑。 我主要怀疑的是,我想在这里介绍一个人应该在什么时候抛出Java方法声明,如下所示:

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

从阅读一些类似的post我收集, 抛出被用来作为一种声明SomeException可能被抛出在方法的执行过程中。

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

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

是否有任何理由,你会想在这个例子中使用抛出 ? 看来,如果你只是做基本的exception处理像IOExceptionexception,你只需要try / catch块,就是这样。

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

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

你能做的最危险的事情就是抓住一个例外,不要做任何事情。

在这里,讨论什么时候适合抛出exception

何时抛出exception?

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

在这里查看一些关于检查与未检查exception的背景: http : //download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

如果方法捕获exception并在内部进行处理(如第二个示例中所示),则不需要包含throws子句。

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

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

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

  3. 捕捉exception,可能执行一些操作,然后重新抛出exception(不只是消息)

你是正确的,在这个例子中, throws是多余的。 有可能是从前面的一些实现中遗留下来的 – 也许这个exception最初是抛出来的,而不是被catch块捕获。

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

你发布的代码是错误的,它应该抛出一个exception,如果捕捉到一个特定的exception,以处理IOExceptionexception,但抛出exception。

就像是:

 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()); } 

}