Java,尝试...在init或run中捕获

时间:2013-07-26 13:06:20

标签: java url

当我为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。

7 个答案:

答案 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()的原始签名不会抛出任何异常,因此您不能抛出已检查的异常。


根据经验:

  1. 如果超级方法没有抛出异常,那么重写的方法只能:
    • 不要抛出任何异常。
    • 抛出未经检查的例外。
  2. 如果super方法抛出未经检查的异常,那么它类似于case 1:
    • 不要抛出任何异常。
    • 抛出未经检查的例外。
  3. 如果超级方法抛出已检查的异常,则重写的方法只能:
    • 不要抛出任何异常。
    • 抛出未经检查的例外。
    • 抛出已检查的异常,但它应该是super方法抛出的异常或子类。

答案 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();
    }
  }