Java throwsとは|throwsとthrowの違いも紹介

- SE
- Javaのthrowsとはどのような時に使用するものなのでしょうか。
- PM
- メソッドの宣言に追加するキーワードです。「このメソッドは例外(Exception)が発生しますよ」という意味があります。
この記事でわかること
Javaのthrowsとは?
Javaのthrowsとは、メソッドの宣言に追加するキーワードです。「このメソッドは例外(Exception)が発生しますよ」という意味があります。throwは知っていてもthrowsは知らないという人も多いのではないでしょうか。
この記事ではthrowsとthrowの違いや、それに関連するJavaの機能を紹介します。例外処理について詳しく知りたい人は是非ご覧ください。
throwsについての導入
throwsについて実例で説明しましょう。まず以下のJavaサンプルをご覧ください。
import java.io.*;
public class MainClass {
public static void main(String[] args) {
FileReader fr = new FileReader(“”c:\\test\\test.txt””);
}
}
このままではエラーが出てしまいます。FileReaderが発生する例外に対応してないからです。
throwsは例外を発生させるという宣言
そもそもなぜFileReaderをnewすると例外が発生する可能性があるのでしょうか。それはFileReaderのコンストラクタの宣言が以下のようになっているからです。
public FileReader(String fileName) throws FileNotFoundException
ここでthrowsが出てきました。throwsは例外を発生させるという意味なので、throwsが付いたメソッドを呼び出すと、例外の対策をしなければならなくなるのです。
try~catchで対応するのが一般的
throwsのついたメソッドの例外対策の方法は2つあります。1つは以下のJavaサンプルのようにtry~catchで囲むことで、多くの場合はそうします。
public class MainClass {
public static void main(String[] args) {
try(FileReader fr = new FileReader(“”c:\\test\\test.txt””);) {
// ファイルを読み込む処理
}
catch (Exception e) {
// エラー処理を行う
}
}
}
try()の自動Close機能で記述を簡潔に
上のJavaサンプルでtry()の括弧の中でFileReaderを生成していますが、これはJava 7から導入された機能で、処理が終わった後に自動的にファイルClose処理を行ってくれます。AutoCloseableを実装しているクラスはこれが可能で、FileReaderも実装しています。
従来はtry~catchに続くfinallyの中でCloseしていましたが、それより簡単な記述で済みます。
catchでの対応について
開こうとしたファイルがない場合、FileReaderはFileNotFoundExceptionが発生します。上のJavaサンプルはそれをcatchで受け取ります。catchのパラメータはException eですが、ExceptionはFileNotFoundExceptionの親クラスなのでこれでcatchできます。
このようにcatchのパラメータをExceptionにすれば様々な例外に一括で対応できます。例外の種類毎に分けたい場合は、以下のようにcatchを連ねることもできます。
catch (FileNotFoundException e) {
// ファイルがないというエラーを出す
}
catch (Exception e) {
// それ以外のエラー処理
}
catchの優先順位に注意
複数のcatchは上から順に判定されますが、注意点はExceptionクラスの下位の方を上にすることです。上の例でFileNotFoundExceptionとExceptionの順番を逆にするとエラーになります。全ての例外がExceptionで処理されてしまい、その後に到達することがないからです。
エラー処理については、「指定したファイル~がありません」と言ったようなエラーダイアログを表示する等が良いでしょう。
自分自身もthrowsすれば例外を受け流せる
throwsのついたメソッドの対応のもう1つの方法は、以下のJavaサンプルのmainメソッドのように、自分自身もthrowsすることです。まるでタライ回しのようで、右から左に受け流すといった印象です。
public class MainClass {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader(“”c:\\test\\test.txt””);
}
}
実際はthrowsを使う機会は少ない
しかし、確かにこれで例外非対応のエラーは出なくなるのですが、このサンプルのケースでは全く対応になっていません。ファイルが無いという例外をmainメソッドの外に投げてしまったら、プログラムが異常終了するだけです。
throwsを使う機会があるとしたら、以下のようにメソッドを分けたようなケースでしょう。それでも結局はtry~catchで処理をすることになります。mainメソッドの外に例外を行かせてはなりません。
public class MainClass {
public static void main(String[] args) {
try {
readFile(“”c:\\test\\test.txt””);
}
catch (Exception e) {
// ファイルが無かった場合の処理
}
}
public static void readFile(String path) throws FileNotFoundException {
FileReader fr = new FileReader(“”c:\\test\\test.txt””);
// ファイル読み込み処理
}
}
throwsの例外は複数記述できる
なおthrowsに記述する例外は1つだけでなく、「,」で区切って複数記述することが出来ます。例えば参照変数がnullだった場合にも備えよう、と言う場合は以下のようにすれば対応できます。
public static void readFile(String path) throws FileNotFoundException,NullPointerException {
FileReader fr = new FileReader(“”c:\\test\\test.txt””);
// ファイル読み込み処理
}
throwの使い方
throwsに似ているthrowについても説明をしましょう。これは意図的に例外を発生させる機能です。以下のJavaサンプルのような使い方ができます。
public static void readFile(String path) throws FileNotFoundException,NullPointerException {
if (path==null) throw new NullPointerException(“”エラー:パス名がnullです。””);
}
このようにメッセージを追加したり、Exceptionクラスを継承した独自の例外クラスを投げたりといったこともできます。
catchして再スローする
以下のJavaサンプルのようにcatchした例外を再スローすることもできます。再スローする前にエラーログを出力するといった使い方ができます。
public static void readFile(String path) throws FileNotFoundException {
try {
FileReader fr = new FileReader(“”c:\\test\\test.txt””);
}
catch (FileNotFoundException e) {
// エラーログ出力をする
throw e;
}
}
- SE
- throwsの使い方やthrowの違いなど、よく理解できました。
- PM
- 普段はあまり使用する機会がないかもしれませんが、例外が発生したときのために覚えておきましょう。
Javaのthrowsは知っておいて損はない
Javaのthrowsについて解説しましたが、ご理解頂けましたでしょうか。Javaプログラミングをしていてthrowsを使用することはあまりないと思われますが、例外がどのように発生するかを知っておく必要はあるでしょう。