Java “的目的”;抛出异常“;

Java “的目的”;抛出异常“;,java,exception,Java,Exception,SwingWorker方法doInBackground是抽象的,文档中说它抛出了一个异常,但具体的实现似乎不需要声明它抛出了异常。Eclipse并没有抱怨,所以似乎异常本身并不是一个“已检查”的异常。当然,任何代码都可能抛出一个运行时异常(这是一个异常),因此本文档似乎在说一些多余的话 protected abstract T doInBackground() throws Exception 一个具体的例子: public Boole

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

protected abstract T doInBackground()
                             throws Exception
一个具体的例子:

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

我可以推测,没有警告可能是IDE和/或语言中的一个限制,但是抛出异常条款似乎有实际的目的。为什么任何具体或抽象的方法都会声明“抛出异常”

Beri提供的链接解释了声明跨方法抛出异常背后的技术规则。要回答您关于“为什么引发异常”的问题,请执行以下操作:

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

抽象方法/接口方法是不同的。你有三个选择:

  • 不要声明任何抛出的异常。这意味着任何实现都可能引发的唯一异常是RuntimeException。这意味着不能抛出任何已检查的异常,并且在几乎所有情况下,调用此方法都应该是安全的,不会出现预期的失败。如果它确实抛出异常,您对此无能为力
  • 抛出特定的已检查异常。这是可以做到的,但在极少数情况下,抽象方法可以正确预测可能抛出的有限的已检查异常集。在编写带有插件的框架时,这是一种指定框架了解如何处理的已检查异常的方法(例如流类中的IOException、FileNotFound)。这样做的含义是,定义的集合是唯一可能发生或有意义发生的已检查异常
  • 抛出异常。在本例中,它表示允许一个具体的实现抛出任何对该实现有意义的已检查异常,而不受任何限制。实现可以选择抛出较少(或无),但允许抛出任何选中的异常。它表示允许实现抛出任何已检查的异常,并且要求调用方处理异常
  • 它没有增加多少价值。为什么不呢?因为checked异常的值是理解可以抛出的特定异常,以便调用者能够有意义地处理它们。当您只剩下“异常”时,并且没有指示一个实现可能抛出什么(或者,对于多个实现,不同的实现可能会有什么不同),就没有什么有意义的方法来处理这一点了,而不仅仅是处理异常,这实际上并不比处理RuntimeException更有意义

    因此,用“throws Exception”声明一个抽象方法的唯一真正价值是显式地说“我们要求调用方显式处理此方法可能引发的异常,因为我们无法保证实现是否可能引发异常。”因此,与其希望实现不会引发异常,我们必须假设它确实如此

    SwingWorker
    方法
    doInBackground
    是抽象的,文档中说它抛出了一个
    异常
    ,但具体的实现似乎不需要声明它抛出了
    异常

    抽象方法声明,如果重写方法执行某些操作可以在不处理异常的情况下抛出异常,则它有时会抛出异常,以允许重写方法声明异常

    我知道有些人不理解,所以这里有一些代码没有编译:

    abstract class Foo {
        abstract void foo();
    }
    
    class Bar extends Foo {
        @Override
        void foo() throws InterruptedException { Thread.sleep(5000); }
    }
    
    Eclipse将拒绝此代码,并声明
    异常InterruptedException与Foo.Foo()
    中的throws子句不兼容(javac也是如此,但我不知道它是否会给出相同的错误消息)

    Eclipse并没有抱怨,所以似乎
    异常
    本身并不是一个“已检查”的异常

    看来,抛出例外条款可能有一个实际的目的


    查看此帖子:它看起来很相关。我的收获是,抽象方法说我们可以声明的东西可以被丢弃,而具体方法可以声明更窄的东西,或者像我的示例中那样,什么都没有。由于范围广泛,抽象方法施加的限制最小。这个问题已经得到了Vikash Dodani的回答,它看起来不如链接形式Beri。看看吧,你会明白的。