When should I announce “throws”, and when not?
我注意到,例如,这两个都在起作用:
1 2 3 4 5 6 7 8 9 | public void func(int a) throws IllegalArgumentException { if(a < 0) throw new IllegalArgumentException("a should be greater than 0."); } public void func(int a) { if(a < 0) throw new IllegalArgumentException("a should be greater than 0."); } |
这让我问:
什么时候我应该宣布
必须始终在方法签名
如果异常
1 2 3 4 5 6 7 8 | /** * @throws This won't appear if you don't write `throws` and this might * mislead the programmer. */ public void func(int a) throws IllegalArgumentException { if(a < 0) throw new IllegalArgumentException("a should be greater than 0."); } |
抛出的美妙之处在于,Exception会转换为Checked Exception,因此每当任何开发人员尝试使用第一种方法时,他都会被警告在调用其签名中抛出的方法之前放置一个try-catch块。
从JLS第11.2节:
The Java programming language requires that a program contains
handlers for checked exceptions which can result from execution of a
method or constructor. For each checked exception which is a possible
result, the throws clause for the method (§8.4.6) or constructor
(§8.8.5) must mention the class of that exception or one of the
superclasses of the class of that exception (§11.2.3).
所以简单地说,如果检查了异常,则需要
有许多技术答案是JLS第1.2节,检查异常等,它解释了它的使用。
但是你的问题
When should I announce throws an Exception, and when not, and just throw it without declare about it?
如果你的代码生成了一些显式异常并抛出它,那么你应该总是添加throws子句,你应该通过在函数上面写/ **生成文档,这将为你生成文档标记。如果在调用此函数之前尚未初始化某些无效参数或某些值,这将帮助使用您的库或函数的所有其他用户绑定某个函数或构造函数。
例,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * * @param filePath File path for the file which is to be read * @throws FileNotFoundException In case there exists no file at specified location * @throws IllegalArgumentException In case when supplied string is null or whitespace */ public static void ReadFile(String filePath) throws FileNotFoundException, IllegalArgumentException { if(filePath == null || filePath =="") throw new IllegalArgumentException(" Invalid arguments are supplied"); File fil = new File(filePath); if(!fil.exists()|| fil.isDirectory()) throw new FileNotFoundException(" No file exist at specified location" + filePath); //..... Rest of code to read file and perform necessay operation } |
此外,这些文档标记和抛出使程序员生活变得容易,他们将重用您的代码,并且如果使用错误的参数调用函数或在指定位置无法使用文件,则会提前知道IllegalArgumentException,FileNotFoundException。
因此,如果您希望您的代码和函数是自我解释的并且提供所有必要的情况,那么抛出异常然后添加以下子句,否则它是您的选择。
请记住,如果你在30天后如果你自己使用(我相信你将来会重新使用它)那些功能那么它将会更有帮助你将完全知道我在该功能中所做的那些条款。
这是因为
1 2 3 4 |
检查异常时,编译器必须要么捕获异常,要么宣布抛出声明。
查看此帖子,了解已检查与未检查的异常的比较。
虽然您需要声明已检查的异常,
如果可以通过执行方法或构造函数抛出未经检查的异常,则不需要在方法或构造函数的throws子句中声明它们。来自 - http://docs.oracle.com/javase/7/docs/api/的java /郎/ RuntimeException.html