当前位置: 首页 > 面试题库 >

声明方法抛出未检查的异常是否有好处?

曾阳飙
2023-03-14
问题内容

如果我有抛出未检查的异常的方法,例如:

void doSomething(int i) {
  if (i < 0) throw new IllegalArgumentException("Too small");
  // ...
}

明确声明该方法引发异常有什么好处,即

void doSomething(int i) throws IllegalArgumentException {
  if (i < 0) throw new IllegalArgumentException("Too small");
  // ...
}

与(或除了)描述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");
  // ...
}

我之所以声称拥有无效的原因throws是:

  • throws没有提供有关在什么情况下会引发异常的信息,只是提供了 可能 引发异常的信息;
  • 因为它是未经检查的异常,所以我不必在调用代码中处理该异常。我只会真正知道,如果我去看看的实现,可能会抛出该错误doSomething
  • 的主体doSomething可能会html" target="_blank">调用引发其他类型的未经检查的异常的代码。声称“这种方法会抛出IllegalArgumentException”似乎只是在讲故事的一部分,可能;
  • 如果该方法是非最终方法,则可以重写该方法,以便声明新实现以引发其他未经检查的异常;您不知道要调用哪个实现。

我之所以认为拥有有用的原因throws是:

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

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


问题答案:

当您声明该方法throws为异常时,您就是在对调用者说:

您有两种选择:

  1. 重新声明自己为引发相同异常。
  2. 捕获并处理异常。

在情况1中,它可能会提醒用户实施finally-可能是一个奖励。

在情况2中,它将注意力集中在例外上,这也可能是一个好处。

如果您隐藏了这种可能性,则用户不会发生以上任何提醒。

对我来说,一个可能不必要地弄乱了他们的代码,而另一个却使代码变得甜美而简单。但是,一种鼓励您将注意力集中在潜在问题上,而另一种则可能使您陷入幸福的无知之中。

底线-问问自己,如何刺激这将是声明异常抛出为(例如你应该申报throws NullPointerException-
?NO!),并为这种刺激通过上行聚焦用户介意的平衡catchfinallythrows



 类似资料:
  • 上一节展示了如何为ListOfNumbers类中的writeList方法编写异常处理程序。 有时,它适合代码捕获可能发生在其中的异常。 但在其他情况下,最好让一个方法进一步推给上层来调用堆栈处理异常。 例如,如果您将ListOfNumbers类提供为类包的一部分,则可能无法预期包的所有用户的需求。 在这种情况下,最好不要捕获异常,并允许一个方法进一步推给上层来调用堆栈来处理它。 如果writeLi

  • 根据我读到的其他问题(为什么重写方法不能抛出比重写方法更广的异常?以及Java方法抛出异常) 我知道子类中的重写方法必须抛出在重写方法中抛出的异常的相同或一个子类。 Java方法总是至少抛出一个类型为exception的异常吗? ...换句话说,编译器添加抛出异常 因此类X将如下所示 我想澄清的是,对于始终添加默认异常处理程序异常这一事实,我没有搞错。 相关问题: IOException与Runt

  • 主要内容:throws 声明异常,throw 拋出异常Java 中的异常处理除了捕获异常和处理异常之外,还包括声明异常和拋出异常。实现声明和抛出异常的关键字非常相似,它们是 throws 和 throw。 可以通过 throws 关键字在方法上声明该方法要拋出的异常,然后 在方法内部通过 throw 拋出异常对象。本节详细介绍在 Java 中如何声明异常和拋出异常。 throws 声明异常 当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部

  • 我正在尝试编写布尔方法,但它不起作用 它的工作,如果我写这个方法: 我应该如何为它制作布尔方法?

  • 问题内容: 我正在查看一位同事的代码,但遇到一段类似于以下代码的代码: 我相信没有必要,但我很难证明这一点。如果它更具体(,等等)可能很有意义,但是因为我认为这是不必要的。有人可以给我一些原因,这可能导致什么问题,以及为什么这是不好的做法?还是这个代码可以吗? 问题答案: 该声明是方法合同的一部分。定义合同时,您应始终尽可能 精确 。因此,说是个坏主意。 出于同样的原因,这是不好的做法,因为不好的

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静