いずれにせよ、この関数によってスローされない例外をスローすると宣言する関数は嫌いです。throw
これは、定義からステートメントを削除せずに関数本体でステートメントを削除すると、リファクタリングで発生しthrows
ます。
そのため、設定 Java -> コンパイラ -> エラー/警告 -> 不要なコード -> スローされた例外の不要な宣言を有効にしました。
これにより、インターフェイスまたはスーパー メソッドで例外が定義されている場合、誤検知の警告が発生します。インターフェースの実装 A が 1 つの例外タイプをスローしないが、実装 B がスローする場合、Eclipse は実装 A の不要な宣言について警告します。そのため、「メソッドのオーバーライドと実装を無視する」サブオプションを有効にしています。
ここまでは完璧です。しかし、私は反対のケースを持っています。オーバーライドされたメソッドは、スーパー メソッドで使用されていない例外タイプをスローします。この最小限の例を参照してください。
class Vehicle {
protected int getStatus() throws GeneralException, StatusException {
throw new GeneralException("One exception type in super type only");
}
}
class Car extends Vehicle {
@Override
protected int getStatus() throws GeneralException, StatusException {
throw new StatusException("Special case, that gets special handling");
}
}
Eclipse で Vehicle の StatusException が警告されるようになりました。
もちろん、これは悪い設計であるなどと主張することもできますが、実際的な観点からは、これが再び発生する可能性があり、おそらくアーキテクチャを変更せずに新しい例外タイプを単にスーパータイプに追加することを受け入れることができます。しかし、この場合、誤検知の警告を取り除くにはどうすればよいでしょうか? もちろん、javadoc でサブオプションを使用することもできますが、これもほとんどの実際のポジティブ ヒットを無視します。もう 1 つのオプションは、SuppressWarning 注釈「未使用」を追加することですが、他のユーザーはその抑制に対して不要な警告を受け取る可能性があります。