throws - Exception(例外) - 萌えJava超入門
第十九章 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.");
    }
    //正常な処理
  }
sub01Exception は架空のチェック例外


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.");
    }
    //正常な処理
}
sub01Exception sub02Exception sub03Exception は架空のチェック例外

そう。
メソッド名の後ろに書く。
「俺はチェック例外を吐くぜ!」
的な宣言だ。
どちらかというと、「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しなきゃ!」と思ってください。



お疲れ様でした。




© 2019 awasekagami