主な実装が 1 つだけの 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、例外は実装によってスローされなくなりましたが、インターフェイスをクリーンアップするのを忘れていたため、キャッチが役に立たなくなったことに気付きませんでした。
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 またはソース コード分析ツールを使用して、宣言されているが決してスローされない例外を検出する方法はありますか?