gpt4 book ai didi

java - "throws Exception"的用途

转载 作者:行者123 更新时间:2023-11-30 06:53:11 25 4
gpt4 key购买 nike

SwingWorker 方法 doInBackground 是抽象的,文档说它抛出一个 Exception 但具体的实现似乎不需要声明它抛出 Exception。 Eclipse 没有提示,所以 Exception 本身似乎不是“已检查”异常。当然,任何代码都可能抛出 RuntimeException(这是一个 Exception),因此该文档似乎在说一些多余的话。

protected abstract T doInBackground()
throws Exception

一个具体的例子:

public Boolean doInBackground() // concrete for abstract
{
performLongRunningProcedure();
return true;
}

我可以推测缺少警告可能是 IDE 和/或语言的限制,但 throws Exception 子句似乎有实际用途。为什么任何方法,无论是具体的还是抽象的,都会声明“抛出异常”?

最佳答案

Beri 提供的链接解释了声明跨方法抛出的异常背后的技术规则。回答“为什么抛出异常”的问题:

在一个具体的(可能会把“final”放在这里,但我不会)中,方法一几乎不需要声明“throws Exception”,因为具体的方法会确切地知道它可能抛出哪些异常并且应该列出那些明确的。

抽象方法/接口(interface)方法不同。您有三个选择:

  1. 不要声明任何抛出的异常。这意味着任何实现都可能抛出的唯一异常是 RuntimeException。这意味着不会抛出已检查的异常,并且在几乎所有情况下都应该安全地调用此方法而不会失败。如果确实抛出异常,您也无能为力。
  2. 抛出特定的已检查异常。这是可以做到的,但在极少数情况下,抽象方法可以正确预测可能抛出的确切有限的已检查异常集。当使用插件编写框架时,这将是一种指定框架了解如何处理的已检查异常的方法(例如,流类中的 IOException,FileNotFound)。这样做的含义是,定义的集合是唯一可能发生或发生有意义的检查异常。
  3. 抛出异常。在这种情况下,它表示将允许具体实现抛出对该实现有意义的任何已检查异常,没有任何限制。一个实现可能会选择少抛出(或不抛出),但允许抛出任何已检查的异常。它表示允许一个实现抛出任何已检查的异常,并且要求调用者处理异常。

它并没有增加多少值(value)。为什么不?因为检查异常的值(value)在于了解可能抛出的特定异常,以便调用者可以有意义地处理它们。当你只剩下“异常”,并且没有指示一个实现可能抛出什么(或者,对于多个实现,一个与另一个可能不同),没有比处理异常更有意义的方法来处理它,这真的没有比处理 RuntimeException 更有意义。

所以用“throws Exception”声明一个抽象方法的唯一真正值(value)是明确地说“我们要求调用者显式处理这个方法可能抛出的异常,因为我们不能保证实现是否可能扔还是不扔。”因此,与其希望实现不会抛出异常,不如假设它会抛出异常。

关于java - "throws Exception"的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37821229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com