-4

当我添加一个 throw Exception 来运行或初始化时,我有一个错误说:

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

我需要 try{..}catch 以获取 URL 作品。try{...}catch 需要抛出异常才能工作。

4

7 回答 7

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);
    }
  }
}
于 2013-07-26T13:09:10.500 回答
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 
    }
    ...
}

按顺序处理特定异常,以便相应地处理它们。

于 2013-07-26T13:08:03.530 回答
0

由于 的原始签名run()没有抛出任何异常,因此您不能抛出已检查的异常。


根据经验:

  1. 如果一个超级方法不抛出异常,那么被覆盖的方法只能:
    • 不要抛出任何异常。
    • 抛出未经检查的异常。
  2. 如果一个超级方法抛出未经检查的异常,那么它类似于案例1:
    • 不要抛出任何异常。
    • 抛出未经检查的异常。
  3. 如果一个超级方法抛出检查异常,那么被覆盖的方法只能:
    • 不要抛出任何异常。
    • 抛出未经检查的异常。
    • 抛出已检查的异常,但它应该与超级方法或子类抛出的异常相同。
于 2013-07-26T13:10:48.630 回答
0

重写方法不得抛出比重写方法声明的新异常或更广泛的已检查异常。例如,声明 FileNotFoundException 的方法不能被声明 SQLException、Exception 或任何其他非运行时异常的方法覆盖,除非它是 FileNotFoundException 的子类。

的原始方法签名run()不会引发任何异常,因此您不能在类中覆盖它并开始引发异常。

于 2013-07-26T13:11:04.053 回答
0

接口 Runnable 包含 void run(),因为它是这样定义的,所以不能通过向覆盖方法添加 throws Exception 来更改它。

于 2013-07-26T13:11:24.873 回答
0

void run()from Runnableinterface 不会抛出异常,即contract. 如果您在运行中的代码抛出异常,要么立即处理它,要么让运行时将其向上传递到层次结构中。

于 2013-07-26T13:11:44.310 回答
0

试试这个..你不能委托错误run()

public void run(){
    try{
          //something which CAN throw an exception
    }catch(Exception e){
          e.printStackTrace();
    }
  }
于 2013-07-26T13:12:18.003 回答