当我为run或init添加throw异常时,我有一个错误,上面写着:
ray.java:115: error run() in xray cannot implement run() in Runnable
public void run() throws Exception(
^
overriden method does not throw Exception
1 error
我需要尝试{..} catch来获取URL工作。 try {...} catch need throw for works。
答案 0 :(得分:8)
Runnable.run()
不会抛出已检查的异常。因此,您不能通过抛出意外异常来实现run() throws Exception
违反Runnable
的合同。
interface Runnable {
// guarantees no checked exception is thrown
public void run();
}
class Foo implements Runnable {
@Override
public void run() throws Exception {} // violates the guarantee
}
你 一般可以做的事情恰恰相反(不适用于Runnable
):
interface Foo {
// Exception might be thrown, but does not have to
public void bar() throws Exception;
}
class FooImpl implements Foo {
// FooImpl does not throw exception, so you can omit
// the throws; it does not hurt if consumer expect an
// exception that is never thrown
@Override
public void bar();
}
要解决您的实施问题,您必须捕获并处理异常(漂亮的解决方案)或将其包装到运行时异常(不太好,但不时完成)。运行时异常不需要在方法签名中声明:
class Foo implements Runnable {
@Override
public void run() {
try {
} catch (Exception e) {
// either handle it properly if you can, or ...
throw new RuntimeException(e);
}
}
}
答案 1 :(得分:4)
编译错误是正确的。您不能将该方法声明为抛出已检查的异常。而是在方法中捕获异常。
@Override
public void run() {
try {
// invoke methods, etc
} catch (SpecificException1 se1) {
// error handling specific to SpecificException1
} catch (SpecificException2 se2) {
// error handling specific to SpecificException2
}
...
}
按顺序处理特定异常,以便相应地处理它们。
答案 2 :(得分:0)
由于run()
的原始签名不会抛出任何异常,因此您不能抛出已检查的异常。
根据经验:
答案 3 :(得分:0)
重写方法不得抛出新的或更广泛的已检查异常,而不是被重写方法声明的异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。
run()
的原始方法签名不会抛出任何异常,因此您无法在类中覆盖它并开始抛出异常。
答案 4 :(得分:0)
接口Runnable包含void run(),因为它是这样定义的,你不能通过向重写方法添加throws Exception来改变它。
答案 5 :(得分:0)
void run()
接口的 Runnable
不会抛出异常,即contract
。如果运行中的代码抛出异常,则要么处理它,要么让运行时将它传递给层次结构。
答案 6 :(得分:0)
试试这个..你不能委托来自run()
public void run(){
try{
//something which CAN throw an exception
}catch(Exception e){
e.printStackTrace();
}
}