No.3ベストアンサー
- 回答日時:
一言で言いますと、Exceptionを継承した場合は例外処理がコード上義務付けられるのに対して、RuntimeExceptionを継承した場合はそれが必須ではなくなるという違いがあります。
そしてExceptionの場合には、throws節でその例外を含む型の宣言をするか、もしくはtry-catchで処理する必要があります。この二つはどちらを使用しても大丈夫(コンパイルエラーにならない)なのですが、前者は具体的な例外処理を『呼び出し先にたらい回しして自身ではやらない』場合に使い、後者はそこで直ちに具体的例外処理のコードを書くのに使用します。
どの場所で最終的な例外処理のコードが書かれるべきかは、クラス設計いかんによりますので、場合によって使い分けるべきだと思います。
あと、実際的問題として、RuntimeExceptionのサブクラスにすると例外処理をしなくて楽なのでそうしがちですが、なんでもかんでもRuntimeExceptionのサブクラスとするのは、一応邪道でしょう。何か例外処理を免除したい特別の理由がないかぎりは、特定のクラスやパッケージに固有の例外は、原則としてExceptionクラスのサブクラスとすべきでしょう。
例:throws節
void someMethod() throws SomeException {
// some process
}
例:try-catch構文
void someMethod() {
try {
// some process
} catch (SomeException e) {
// some error handling
}
}
参考URL:http://www.y-adagio.com/public/standards/tr_java …
基本はExceptionを継承し、後処理を行った方が良いということですね。
それに対しRuntimeExceptionの場合は、特例・もしくは回復不能なエラーの場合にのみ使用ということですね。
確かにこの点に関しては、クラス設計に依存すると思いますので、Exception,RuntimeExceptionを使い分けるよう再度考えたいと思います。
丁寧な説明、ありがとうございました。
また何かありましたら、よろしくお願いします。
No.2
- 回答日時:
Exceptionを継承した例外クラスだと、メソッドがこの例外を出す可能性がある場合はメソッドの宣言にthrows節が必要ですし、受ける側のメソッドもtry-catchで受けるか更にthrows節で同例外を生起する可能性があることを宣言しなければいけません。
RuntimeExceptionを継承した例外クラスについてはこのような宣言が必要ありません。
原則として呼び出し側メソッドで解決して外側に伝搬させないべき例外はExceptionを継承し、呼び出し側メソッドでは解決しにくく何段階にも渡って外部へ伝搬しなければいけない例外はRuntimeExceptionを継承するべきでしょう。
特に発生したらプログラムを終了させるしかないような例外はRuntimeExceptionで良いでしょう。
プログラミングでは解決できないような例外は、RuntimeExceptionを継承すべきということですね!
勉強になりました。
ありがとうございます。
No.1
- 回答日時:
親クラスは Throwable ならば throw は出来るんじゃないですか? で、Exception の方は全ての例外の親となるクラス(Errorの方は全てのエラーの親となるクラス)で、RuntimeException も Exception を継承したクラスのうちの一つです。
見ただけで意味が分かるようにするために RuntimeException (実行時例外) という名前のクラスを作ったんだと思いますよ。Exception (例外) だけではどんな例外かがよく分からないからです(他のもそうだと思います)。
ということで詳細は java.lang.Thurowable のドキュメントを読んで下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java 自作Androidアプリのデータ引き継ぎ方法について。 Android Studio でアプリを作成 1 2022/08/13 21:44
- Java JavaでWebページ作成 7 2023/07/21 21:09
- Visual Basic(VBA) VBプロジェクトでのフォルダ構成について 1 2023/07/22 03:49
- PHP Java のクラスには修飾子があるのに、PHP はクラスに修飾子が無い ? 2 2022/08/14 18:15
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サーバー上のフォルダ情報の取得
-
【C#】クラスのコンストラクタ...
-
C# 「データが失なわれる可能性...
-
interface,extend,implementの...
-
オーバーライドとラッパーの違い
-
インターフェース型の使い方が...
-
System.Collections.Generic.Li...
-
Commons-Discovery.jarとは?
-
Javaのインスタンス化の構文の...
-
JTextFieldの入力制限
-
委譲って何ですか?
-
Javaで下線
-
抽象クラスとインタフェースの...
-
setTextについて
-
「継承されたメソッドの可視性...
-
インタフェースのstatic変数(Java)
-
抽象クラスをJUNITでテストする...
-
(vba)他のアプリケーションの右...
-
レコード件数の表示
-
「タイプ初期化子が例外をスロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
VB DLLプロジェクトについて
-
C# 「データが失なわれる可能性...
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
メソッドの引数にクラス名を渡す
-
ファイルパスが取得出来ない(P...
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報