質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1018閲覧

「java」検査例外と非検査例外に関する質問です。

tora19

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2022/10/17 06:16

編集2022/10/17 06:20

質問内容

javaシルバーの勉強をしているのですが、回答の解説を読んでも疑問が消えないので、質問させてください。
以下の問題の回答は、AとDです。
Aはわかるのですが、なぜDも正解なのでしょうか?
問題のhelloメソッドはif文で検査例外もthrowされる可能性があるなら、メソッド宣言時にthrows句でどのような例外がスローされるかを宣言する必要があるのではないのでしょうか?

問題

次のSampleクラスの2行目の空欄に入るコードとして、正しいものを選びなさい。(2つ選択)

java

1public class SampleExcpection extends Exception {}

java

1public class TestExcpection extends RuntimeException {}

java

1public class Sample { 2 public void hello(String name) 【ここに入るコードを選ぶ問題】{ 3 if (name == null ) { 4 throw new SampleException(); 5 } 6 if ( "" .equals(name) ) { 7 throw new TestException(); 8 } 9 // do someting 10 } 11}

回答の選択肢
A. throws SampleException, TestException
B. throws SampleException; TestException
C. throws TestException
D. throws SampleException
E. 何も記述しなくて良い

回答

A,D

回答の解説

「Exceptionクラスを継承している例外クラスは、try-catchしているか、もしくはthrows句で宣言しているかのどちらかを強制されます。」とあり、また
「非検査例外はthrows句で宣言してもしなくても、どちらでも問題ありません」とあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/10/17 07:55

ちなみに、実際にコードを書いて動作検証をしたりはされてるのでしょうか?
tora19

2022/10/19 13:40

はい。動作してみて理解が出来なかったので質問させていただきましたが、回答のおかげで理解できました。
m.ts10806

2022/10/19 21:18

投稿内容から動作検証したことが分かりませんでした。 次回以降で結構ですので、自身が持っている情報や試したこと調べたことはきちんと記載してください。 そのような指摘や回答がつくということは伝わる内容にはなっていないということですので。
guest

回答3

0

ベストアンサー

SampleExceptionは検査例外です。
TestExceptionは非検査例外です。
これは大丈夫でしょうか?

「非検査例外はthrows句で宣言してもしなくても、どちらでも問題ありません」

と解説にあるように、

SampleExceptionは検査例外なのでtry-catchしているか、もしくはthrows句で宣言する必要があります。
TestExceptionの方は非検査例外なので、throws句で宣言してもしなくても、どちらでも問題ありません

一つでも検査例外が含まれていたら、検査非検査を問わずにすべての例外を宣言する必要があるわけではありません。

投稿2022/10/17 06:49

編集2022/10/17 06:54
ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、例外の概念を理解した方が早いと思います。

ここによると例外には検査例外非検査例外があるようです。

上記サイトでは検査例外は

非検査例外は正しいプログラムを書くことで回避できる

例外のようですね。

つまり『int型にすべきところをなぜかstringでやっている』とかみたいな設計やコーディングのミスによる例外ってことですね。こういうのは適切に設計したり適切にコーディングすればいいだけです。
わざわざユーザに知らせる必要はないので。所謂ヌルポ(生成していないオブジェクトを使おうとした系の例外)とか。

ただ、例外でも「(読み込みたい)対象ファイルが無い」とかのようにコーディングとかではどうしようもない例外がありますね。ユーザが何かしらの理由でファイルを削除していたり、コマンドライン引数として渡されていたならそのパスが間違っているとか。そういう場合は「おーい、利用者さんや、ファイルが無いぞい」と教えてあげたりしないといけませんね。もしくはプログラム側で「無いなら作成する」とかでもいいですけど。
とにかく例外があったときにユーザに知らせるとかプログラム側で動作を変えるとかのようになんらかの処理が必要な場合があります。
そういう場合に投げられる例外が検査例外ということです。

そして今回の場合はJVMとかが受けても「もうどうしようもない」のでどのみち例外による強制終了状態になるので指定しなくてもいいということだと思いますよ。

投稿2022/10/17 07:37

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実際にコードを書いてみては如何でしょうか。

投稿2022/10/17 06:51

編集2022/10/17 06:52
jimbe

総合スコア13327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tora19

2022/10/19 13:41

はい。動作してみて理解が出来なかったので質問させていただきましたが、回答のおかげで理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問