我有很多Java接口只有一个主要实现(不包括模拟和存根)。
随着时间的推移,接口及其实现也在不断发展,包括某些方法抛出的异常。
问题是当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是当实现不再抛出异常时,会有一个警告提醒我们删除实现中的异常声明,但是我们经常忘记将其从接口中删除。
因此,我们最终在接口的客户端代码中处理从未实际抛出的异常。
第1步,我们在实现中有一个例外,它在链上传播:
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,实现不再抛出异常,但是我们忘记清理接口了,所以不要意识到catch不再有用了:
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中或使用源代码分析工具检测那些声明但从未抛出的异常,以便能够进行一些清理?
答案 0 :(得分:-1)
你的意思是:
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);
}});
???