1. ホーム
  2. java

[解決済み] オーバーライドされたメソッドが例外を投げない

2022-02-14 12:09:45

質問

あるクラスのメソッドで、ある条件を満たすと例外をスローするようにしたいのですが、コンパイル時に問題が発生しました。しかし、コンパイル時にメッセージが表示されます。

オーバーライドされたメソッドは例外をスローしません

以下は、クラスと例外の宣言です。

public class UNGraph implements Graph

Graph のすべてのメソッドを持つインターフェイスです。 UNGraph は、その中にある(メソッド getId() には throws の宣言がある)

コンストラクタの後、私は例外を作成します(クラスUNGraphの中)。

public class NoSuchElementException extends Exception {
    public NoSuchElementException(String message){
        super(message);
    }
}

以下は例外を含むメソッドです。

public int getId(....) throws NoSuchElementException {
    if (condition is met) {
        //Do method
        return variable;
    }
    else{
       throw new NoSuchElementException (message);
    }
}

もちろん、このメソッドが毎回例外を投げる必要はなく、条件が満たされないときだけ例外を投げるようにしたい。そして条件が満たされたときには、変数を返したい。

どのように解決するのですか?

Java では、メソッドをオーバーライドしてチェックした Exception (ユーザー定義のカスタム例外を拡張したもの) を追加することができないため、コンパイラーはエラーを発行しています。 Exception クラス)を使用しています。というシナリオを処理したいことは明らかだからです。 ではない を予期せぬ出来事(バグ)として捉えることができるため、最良の選択肢は RuntimeException . A RuntimeException などと言う。 IllegalArgumentException または NullPointerException はメソッドシグネチャに含める必要がないため、コンパイラのエラーを軽減することができます。

あなたのコードに次のような変更を加えることを提案します。

//First: Change the base class exception to RuntimeException:
public class NoSuchElementException extends RuntimeException {
    public NoSuchElementException(String message){
        super(message);
    }
}

//Second: Remove the exception clause of the getId signature
//(and remove the unnecessary else structure):
public int getId(....) {
    if ( condition is met) { return variable; }
    //Exception will only be thrown if condition is not met:
    throw new NoSuchElementException (message);
}