什么时候在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子句。
你看的代码并不理想。 你应该:
-
捕捉exception并处理它; 在这种情况下
throws
是不必要的。 -
删除
try/catch
; 在这种情况下,Exception将由一个调用方法处理。 -
捕捉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()); }
}