And*_*ner 12 java exception unchecked-exception
如果我有一个抛出未经检查的异常的方法,例如:
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
Run Code Online (Sandbox Code Playgroud)
明确声明该方法抛出异常是否有任何好处,即
void doSomething(int i) throws IllegalArgumentException {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
Run Code Online (Sandbox Code Playgroud)
与(或除了)描述javadoc中的行为相反:
/**
* This method does something useful.
* @param i some input value
* @throws IllegalArgumentException if {@code i < 0}
*/
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
Run Code Online (Sandbox Code Playgroud)
我声称它的原因是没有用的throws是:
throws没有提供关于抛出异常的情况的信息,只提供可能抛出的异常;doSomething;doSomething可能的主体调用抛出其他类型的未经检查的异常的代码; 声称'这种方法抛出IllegalArgumentException'似乎只是说明了故事的一部分,可能;我之所以声称它的原因是有用的throws:
简而言之,我认为这throws是不必要的,但javadoc描述通过@throws是有用的.我很想知道别人对此的看法.
如果您的API用户无法看到您的源代码,他将看不到javadoc注释.这就是为什么声明该throws条款可能有用.
一些程序员更容易从方法签名中快速确定异常,而不是查看javadoc中的内容.
但总的来说,我认为仅在javadocs中列出未经检查的异常更有用,因为如果在throws子句中同时存在已检查和未检查的异常,则情况可能会令人困惑.没有编译器或没有查看每个异常类签名,您无法确定异常的类型.
然而,未经检查的异常意味着情况是关键的,并且程序无法在运行时修复.如果你通过检查异常的目的使用未经检查的异常(你假设情况可以修复)但由于某种原因你不希望编译器强制捕获异常,那么我建议也将异常置于throws子句中.
当您声明一个方法throws是您对调用者说的异常时:
你有两个选择:
在案例1中,它可以提醒用户实施finally- 这可能是奖励.
在案例2中,它将思想集中在例外,这也可能是一个奖励.
如果您隐藏了这种可能性,则上述提醒都不会发生在用户身上.
对我来说,一个人可能会不必要地混乱他们的代码,而另一个人保持它的甜蜜和简单.然而,一个人鼓励关注潜在的问题,而另一个人可能会让你感到幸福无知.
底线-问问自己,这将是多么刺激声明异常抛出为(例如你应该申报throws NullPointerException- ?NO!),并为这种刺激通过关注用户的上攻平衡介意catch,finally和throws.
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |