我有很多只有一个主要实现的 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 中或使用源代码分析工具来检测那些声明但从未抛出的异常,以便能够进行一些清理?