[解決済み] オーバーライドされたメソッドが例外を投げない
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);
}
関連
-
[解決済み】Javaパッケージが存在しないエラー
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ユーザー 'root'@'localhost' (using password: YES) のためのアクセスが拒否されました。
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み] テスト
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)