ここから本文です

「例外を投げる」の意味がわかりません。 大学生です。 javaを独学で勉強して...

アバター

ID非公開さん

2017/7/1610:00:07

「例外を投げる」の意味がわかりません。

大学生です。
javaを独学で勉強しているのですが、「例外を投げる」という言葉の意味が分かりません。

例外そのものやtry-catchなどは理解できるのですが、
throw、throws辺りで出てくる「例外を投げる」という言葉の「投げる」が理解できません。
教本として使っているjavaの本を読んだり、ネットで検索したりもしましたが、納得いく答えが見つかりません。

例外を投げた後の処理の流れなども具体的に踏まえて教えていただけると助かります。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
373
回答数:
4
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

mzg********さん

2017/7/1615:35:07

何らかの不具合があって「例外」というボールを投げる投手はおおむねメソッドなので、そのメソッドの呼び元から見れば、returnで何らかの値が返る代わりに例外が帰ってくる。呼び元にキャッチャーとなるtry catch構文があって、catchできる例外ならそこで処理される。
その例外を投げてるメソッドにおいては例外を投げたら処理終了なので、呼び元のメソッド(コンストラクタも含む)で catchしなければ(catcherが居ない状態)、さらに上流の呼び元に投げ返していく、どこもcatchしなければ、最後はプログラムがエラー終了する。キャッチャー不在で試合中止ってとこかな?

アバター

質問した人からのコメント

2017/7/16 16:50:43

ものすごくわかりやすかったです。
一読で腑に落ちました!

他の方もご回答ありがとうございました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

rat********さん

リクエストマッチ

2017/7/1616:20:47

public class NBS{

public static void main(String[] args){


try{
on();//⓪まずここでメソッドonを呼んだ
//④ここにメソッド内で発生した例外が「投げられた」
}catch(Exception e){
//⑤ここで例外が受け止められ、下のメッセージが表示された
System.out.println("ここでキャッチ");
}

}

static void on() throws Exception{//③ここでメソッドの呼び出し元に発生した例外を「投げ」られる

throw new Exception();//①例外を新しく発生させ「投げた」
//②try-catchでくくってないけど


}

}

tar********さん

2017/7/1615:45:49

func1 から (try-catch の中で) func2 を呼び
func2 から (try-catch を使わずに) func3 を呼び
func3 から (try-catch を使わずに) func4 を呼び
func4 の中では
なにかよくない状況を検出したら例外を throw するようなコードになっていたとします。

実行したとき、
そのよくない状況がおこって例外を throw したとします。
すると、例外処理モードに入ります。
func4 の残りの部分の実行は放棄してfunc3 に戻ります。
(func4 を呼び出してたわけですが、その行に戻ります)
func3 は try-catch がないので例外処理をできません
なので func3 も残りの部分の実行を放棄してfunc2 に戻ります。
func2 も try-catch がないので例外処理はできません
なので func2 も残りの部分の実行を放棄してfunc1 に戻ります。
func1 は try-catch があるので (try節内の残りの部分は放棄したうえで)
catch 節を実行します。
例外の処理はされました。これで例外の処理は完了しました。
例外処理モードは終了です。
通常の処理に戻ります。
その後は、func1 の残りの部分の実行が続けられます。

これが try-catch の動作です。
この「例外処理モードに入る」ことを「例外をthrowする」と表現すると理解しておけばいいと思います。

なんで throw というのか?という疑問の答えは持ち合わせていませんが、
想像するとこんな感じではないでしょうか。
throw が書いてある func4 という関数・メソッド自体は throw したあと
次にどういう処理が行われるかわかっていません。
たとえば func5 も func4 を呼び出してる場合、
例外処理で func1 に戻るか func5 に戻るかは
実際に実行して例外が発生してみないとわかりません。
わからないんだけど、「よくないことがおこったから誰か対処してね!」
と後始末を丸投げしてるわけですね。
catch というのは、丸投げされた「対処してね!」という雑用を受け止めてるわけですね。
そんなニュアンスで throw/catch という単語なのだと
個人的には勝手に理解しています。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

nan********さん

2017/7/1611:51:26

英語の throw を直訳してので、投げるになっただけです。
分かりにくいですね。
単に、指定した例外をソフト的に発生させるだけです。
そうすると、
対応する catch があれば、その中に入ります。
goto 命令が無いので、面倒だから飛ばしたい時なんかに使えますね。
また、意味的に間違っているのを検出した場合も重宝しますよ。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる