我在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中的实例化不同,可能会出现此问题。
答案 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();
}
}