6

いずれにせよ、この関数によってスローされない例外をスローすると宣言する関数は嫌いです。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 注釈「未使用」を追加することですが、他のユーザーはその抑制に対して不要な警告を受け取る可能性があります。

4

1 に答える 1