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

- システム
エンジニア - Javaのthrowsとはどのような時に使用するものなのでしょうか。
- プロジェクト
マネージャー - メソッドの宣言に追加するキーワードです。「このメソッドは例外(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;
}
}
- システム
エンジニア - throwsの使い方やthrowの違いなど、よく理解できました。
- プロジェクト
マネージャー - 普段はあまり使用する機会がないかもしれませんが、例外が発生したときのために覚えておきましょう。
Javaのthrowsは知っておいて損はない
Javaのthrowsについて解説しましたが、ご理解頂けましたでしょうか。Javaプログラミングをしていてthrowsを使用することはあまりないと思われますが、例外がどのように発生するかを知っておく必要はあるでしょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)