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”,因为一个具体的方法将确切地知道它可能抛出哪些异常,并且应该显式地列出这些异常 抽象方法/接口方法是不同的。你有三个选择:
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。看看吧,你会明白的。