第十九章 Exception(例外)
throws
発生した例外を呼び出し元に返します。
目次
throwsを宣言しているメソッドは
必ず try-catchしよう。
1. throwsとは
throws は、メソッドに与えられる宣言のようなものです。
そのメソッドが、throws に続く例外をスローする可能性があることを示します。
throws を宣言したメソッドは、メソッド内でスローされた例外を、メソッドの呼び出し元にスローします。
具体的な例外処理(つまり try-catch)をメソッドの外に書きたい時に使います。
部下が打ち上げた問題点を
上司に丸投げするんすね?
無能な中間管理職
ってことね?
えぇぇ~。
非チェック例外は throws を省略できる
throws を記述しなければいけないのは、
チェック例外 をスローする可能性があるメソッドです。
スローする例外が 非チェック例外 であれば、throws を記述する必要はありません。
非チェック例外 が、try-catch を省略できるのと同じで、
throws も省略 できます。
2. 書式
throws はこんな風に宣言します。
なるほど。
メソッドに宣言するんすね。
throws の書き方
public void メソッド名() throws sub01Exception {
if( sub01Exceptionスローの条件式){
throw new sub01Exception("sub1Exception message.");
}
//正常な処理
}
throws の書き方 複数の例外がある場合
public void メソッド名() throws
sub01Exception,
sub02Exception,
sub03Exception {
if( sub01Exceptionスローの条件式){
throw new sub01Exception("sub01Exception message.");
}
if( sub02Exceptionスローの条件式){
throw new sub02Exception("sub02Exception message.");
}
if( sub03Exceptionスローの条件式){
throw new sub03Exception("sub03Exception message.");
}
//正常な処理
}
そう。
メソッド名の後ろに書く。
「俺はチェック例外を吐くぜ!」
的な宣言だ。
どちらかというと、「throws を使ったメソッドを自分で作る」というよりも、
「throws を使ったメソッドを使う」という場面の方が多いでしょう。
そんな時は難しく考えず、try-catch で受けましょう。
throws には try-catch
通常、throws が記述されるのは、チェック例外 をスローするメソッドです。
従って、throws が記載されたメソッドを使う場合には、
必ず try-catch で受ける必要があると思って下さい。
try-catch を書かずに、さらに throws することもできますが、
最終的には try-catch で受ける必要があります。
try-catch 又は throws で受けていない場合には、コンパイルエラーを発生します。
try-catch か throws で
必ず受けないと
いけないのね。
3. throw→ throws→ try-catch のサンプル
FileNotFoundException をスローするだけの fileNotLoaderメソッドを作って
動作を確認してみましょう。
FileNotFoundException はチェック例外です。
try-catchを要求するメソッドは、
こんな風にできていると思ってくれ。
//Sample19_33.java
import java.io.FileNotFoundException;
class Sample19_33{
public static void main(String[] args){
String strFileName = "ヒザカックン.txt";
try{
fileNotLoader(strFileName);
}catch(FileNotFoundException e){
System.out.println("mainメソッドのcatchです。");
e.printStackTrace();
}
System.out.println("fileNotLoaded.");
}
public static void fileNotLoader(String str)
throws FileNotFoundException{
/*
このメソッドはファイルをロードしません。
例外をスローするだけです。
*/
throw new FileNotFoundException("ファイルが見つかりません。");
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample19_33.java
ws>java Sample19_33
mainメソッドのcatchです。
java.io.FileNotFoundException: ファイルが見つかりません。
at Sample19_33.fileNotLoader(Sample19_33.java:18)
at Sample19_33.main(Sample19_33.java:8)
fileNotLoaded.
fileNotLoaderメソッドは、自分で throw した例外を
throws でメソッド外にスローします。
fileNotLoaderメソッドを使うときは、必ず try-catch で受ける必要があります。
throw → throws → try-catch ってことです。
ふ~ん。
今のわかった?
4. 使いどころ
例えば、ファイルを読み込むメソッドを想像してみてください。
読み込むファイルが見つからなかった場合の処理を、メソッドの外で定義した方が
いろいろな場面で使える気がしませんか?
見つかったファイルだけ読み込むとか
見つからなかったファイルをリストにするとか、
一つでも見つからなかったら、メッセージを表示して中断するとか。
敢えて例外処理を先送りして、自由度を高めたい様な場合に使用します。
try-catch を書く場所を
選ぶことができる仕組みだ。
throws を見かけたら、「try-catchしなきゃ!」と思ってください。
お疲れ様でした。