Java 清理接口中声明但未由实现引发的异常
我有很多Java接口,只有一个主实现(不包括mock和stub) 随着时间的推移,接口及其实现不断发展,包括某些方法引发的异常 问题是,当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是,当实现不再抛出异常时,会出现一条警告,提醒我们删除实现上的异常声明,但我们经常忘记将其从接口中删除 因此,我们最终在接口的客户机代码中处理从未实际抛出的异常 第1步,我们在实现中遇到了一个异常,它会向上传播:Java 清理接口中声明但未由实现引发的异常,java,exception,interface,Java,Exception,Interface,我有很多Java接口,只有一个主实现(不包括mock和stub) 随着时间的推移,接口及其实现不断发展,包括某些方法引发的异常 问题是,当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是,当实现不再抛出异常时,会出现一条警告,提醒我们删除实现上的异常声明,但我们经常忘记将其从接口中删除 因此,我们最终在接口的客户机代码中处理从未实际抛出的异常 第1步,我们在实现中遇到了一个异常,它会向上传播: interface Service { void doSomething() t
interface Service {
void doSomething() throws MyException;
}
class ServiceImpl implements Service {
void doSomething() throws MyException {
if (dummyCondition) {
throw new MyException("oops");
}
System.out.println("hello world");
}
}
class Client {
@Inject Service service;
void clientCode() {
try {
service.doSomething();
} catch(MyException e) {
logger.error("oops", e);
}
}
}
第2步,实现不再抛出异常,但我们忘记清理接口,因此没有意识到捕获不再有用:
interface Service {
void doSomething() throws MyException;
}
class ServiceImpl implements Service {
void doSomething() {
if (dummyCondition) {
logger.warning("actually, don't throw, just log 'oops'");
}
System.out.println("hello world");
}
}
class Client {
@Inject Service service;
void clientCode() {
try {
service.doSomething();
} catch(MyException e) {
logger.error("oops", e); // we'll never get there.
}
}
}
理想情况下,我希望在接口上显示一个警告,比如“声明了异常,但没有由任何已知实现引发”
在Eclipse中或使用源代码分析工具,有没有一种方法可以检测那些已声明但从未抛出的异常,以便进行清理?您的意思是:
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
System.out.println("Thread "+arg0+" throwed uncaught exception:");
arg1.printStackTrace();
cleanupcode(); //clean up code
savefiles(); //method to save files used by your app
//You can create here a dialog with crash:
JOptionPane.showMessageDialog(null, "Thread "+arg0+" throwed uncaught exception: "+arg1);
System.exit(0);
}});
??当您执行将由外部客户端使用的API时,最好将所有异常声明为RuntimeException。您是否应该实现一个接口,而不是由于实现中的更改而更新接口?它不适用于外部客户端。这只是我项目的内部内容。我声明了一个接口,以便在不同时测试实现代码的情况下更容易地测试接口的客户机(它们是同一产品中的其他类)。我所说的异常是在接口中声明的,但不是由任何实现引发的。这是一个代码清理问题,不是在runtimeWrite示例中要处理的问题。我不明白