有以下问题:
我有一个带有方法“call”的抽象类,它基本上调用了一些otherMethod,如果otherMethod抛出异常,我会尝试通过重新调用并再次调用“call”方法来修复catch。
public Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
while (true) {
try {
return callMethod(methodName, parameters, parameterTypes);
} catch (SomeException e) {
if (numberOfTriesLeft-- == 0) {
throw new RetryingException();
}
login();
}
}
}
现在我有一个带有overriden方法调用的类的子类,可以使用null参数。基本上如果发生这种情况我想从超类调用该方法,但是不会抛出上面提到的异常,因此,没有重试和方法结束在其他地方失败。有没有办法手动抛出它并通过进一步或任何其他方式来修复它?谢谢你的帮助!
@Override
public Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
if (parameters[0] == null){
// What to do here if I want to throw SomeException here to end up in a catch block from the call method in the superclass? Or how to change it
}
// Everything ok. No null params
...
return super.call(methodName, parameters, parameterTypes);
}
答案 0 :(得分:1)
根据我的经验,你能做的就是拥有这样的父方法:
public final Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
try {
callMethod(methodName, parameters, parameterTypes)
} catch (Exception ex) {
// Handle any exception here...
}
}
protected Object callMethod(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
// .. your code
}
然后改为覆盖callMethod
(子)方法:
@Override
protected Object callMethod(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
// Exception thrown here will now be caught!
return super.callMethod(methodName, parameters, parameterTypes);
}
因此,这将接口方法与可重写方法分开。我在现有的API中看到了这种模式。
有些观点:
call
现在final
阻止它被覆盖。callMethod
为protected
,使其只能覆盖并可从同一个程序包中调用 - 将其从公共API中删除。更新:采取@Fildor提供的点。