声明方法是否会抛出未经检查的异常是否有优势?

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'似乎只是说明了故事的一部分,可能;
  • 如果该方法是非final的,则可以重写它,以便声明新的实现抛出额外的未经检查的异常; 你不知道你正在调用哪个实现.

我之所以声称它的原因是有用的throws:

  • 它报告了您在调用方法时可能会遇到的问题.

简而言之,我认为这throws是不必要的,但javadoc描述通过@throws是有用的.我很想知道别人对此的看法.

Nai*_*gun 6

如果您的API用户无法看到您的源代码,他将看不到javadoc注释.这就是为什么声明该throws条款可能有用.

一些程序员更容易从方法签名中快速确定异常,而不是查看javadoc中的内容.

但总的来说,我认为仅在javadocs中列出未经检查的异常更有用,因为如果在throws子句中同时存在已检查和未检查的异常,则情况可能会令人困惑.没有编译器或没有查看每个异常类签名,您无法确定异常的类型.

然而,未经检查的异常意味着情况是关键的,并且程序无法在运行时修复.如果你通过检查异常的目的使用未经检查的异常(你假设情况可以修复)但由于某种原因你不希望编译器强制捕获异常,那么我建议也将异常置于throws子句中.


Old*_*eon 5

当您声明一个方法throws是您对调用者说的异常时:

你有两个选择:

  1. 将自己视为抛出相同的异常.
  2. 抓住异常并处理它.

在案例1中,它可以提醒用户实施finally- 这可能是奖励.

在案例2中,它将思想集中在例外,这也可能是一个奖励.

如果您隐藏了这种可能性,则上述提醒都不会发生在用户身上.

对我来说,一个人可能会不必要地混乱他们的代码,而另一个人保持它的甜蜜和简单.然而,一个人鼓励关注潜在的问题,而另一个人可能会让你感到幸福无知.

底线-问问自己,这将是多么刺激声明异常抛出为(例如你应该申报throws NullPointerException- ?NO!),并为这种刺激通过关注用户的上攻平衡介意catch,finallythrows.