是否有可能在异常后恢复Java执行?

时间:2017-09-07 08:10:05

标签: java exception

我在JAR中有一个ParentClass,但没有源代码。我正在实现一个SubClass,但我需要处理一些极端情况。

class ParentClass {
    void foo() {
       … // lots of code 1
       ; // can possibly throw NullPointerException 
       … // lots of code 2
    }
}
class SubClass extends ParentClass {
    @Override
    void foo() {
       try {super.foo();}
       catch(NullPointerException npe) {… /*handle exception*/}
       finally {… /* resume lots of code 2 ? */}
    }
}

在重写方法中处理异常后,有没有办法运行//lots of code 2部分?我不想重复代码,也不能修改ParentClass。

P.S:ParentClass中没有NullPointerException问题。但由于SubClass中的实例化不同,可能会出现此问题。

2 个答案:

答案 0 :(得分:3)

没有

你不能只是跳回到方法的中间。

如果您不想将代码复制粘贴(好的调用!),您必须将共享代码放入子类可以调用的单独方法中。

或者你可以将可能抛出NullPointerException的部分放入一个单独的方法中并在子类中覆盖它(以便它不再抛出)。

  

但由于SubClass中的实例化不同,可能会出现此问题。

也许你可以通过改变你实例化的方式完全回避这个例外?也许为当前This is the new Tesla.<span class="huge-title">Wow, 500 miles</span> 的事物提供“虚拟对象”?什么东西不会做任何有害的事情,但会阻止异常?

答案 1 :(得分:2)

正如其他人指出的那样,你不能回到那里。但是,您可以refactor Parent.foo()这样的内容:

class ParentClass {
    protected void foo() { //  made it protected so it's overridable
       stuffBeforeNPE(); // Extract Method Refactoring
       codeWithPossiblyNPE(); // Extract Method Refactoring
       stuffAfterNPE(); // Extract Method Refactoring
    }

    protected void stuffBeforeNPE() { ... } // you might want to add params and return values
    protected void codeWithPossiblyNPE() { ... }
    stuffAfterNPE() { ... }
}

现在,您的子类可能如下所示:

class SubClass extends ParentClass {
    @Override
    protected void foo() {
      stuffBeforeNPE();
       try {
          codeWithPossiblyNPE();
       } catch(NullPointerException npe) {
          … /*handle exception*/
       }
       stuffAfterNPE();
    }
}