throws、throw構文は、Exceptionを継承した例外クラスを呼び出し元のメソッドに通達させる方法です。
Web3階層アーキテクチャにSpringFrameworkを用いて、Webサービスを実行している過程で例外が発生した概要図です。
SpringFrameworkなどを利用して、データベースにデータの保存を全体で行う概要です。
DaoException,ServiceExceptionはExceptionを継承したプロジェクト独自の例外クラスです。
この処理の全体の流れのように、例外が発生した処理から呼び出し元に通達する義務があります。
そして、大きな機能の層(プレゼンテーション層、サービス層、データ層)を跨ぐときに、
その層からの共通の例外クラス(ServiceException,DaoExceptionなど)のインスタンスを生成し、呼び出し元に通達させます。
最後に、全体の最終処理をする(上記ではControllerクラス)クラスで例外のthrowが終了します。
throw
例外クラスのインスタンス;
throws
例外クラス,
例外クラス2 { //例外処理を含む処理
doSomething();
}
最も簡単なthrowのサンプル
private void throwExceptionSample() throws ApplicationException{
throw new ApplicationException();
}
この例は、例外をスローするための最小限のサンプルです。実際にthrow構文を処理するブロックはcatch節です。
前頁のサンプルにthrow,throwsを追加したサンプルです。
1つのクラスで例外処理が閉じられているサンプル
package jp.co.yourcompany.education.samples;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import jp.co.yourcompany.education.exception.ApplicationException;
import jp.co.yourcompany.education.log.InitApplication;
/**
* Java例外処理(try,catch,finally,throw,thorws)学習用のクラス
* @author raita.kuwabara
*/
public class JavaTrySample {
/**
* 正常データ
*/
public static final String TEST_FILE = "c:¥¥projects¥¥education¥¥data¥¥input¥¥sample_data.txt";
/**
* 存在しないファイル
*/
public static final String VALID_TEST_FILE = "c:¥¥projects¥¥education¥¥data¥¥input¥¥invalid_data.txt";
/**
* ファイルのエンコード
*/
public static final String FILE_ENCODING = "UTF-8";
/**
* ログ
*/
public static final Logger log = Logger.getLogger( JavaTrySample.class.getName() );
/**
* デフォルトコンストラクタ
* ログの初期化処理を実施する。
*/
public JavaTrySample(){
InitApplication app = InitApplication.getInstance();
app.init();
}
/**
* 全ての例外処理を実行する。
*/
public void execAllSample(){
try{
log.info("正常ファイルの読取りを行います。");
fileReadSample( JavaTrySample.TEST_FILE );
log.info("正常ファイルの読取りが正常に終了しました");
log.info("存在しないファイルの読取りを行います。");
fileReadSample( JavaTrySample.VALID_TEST_FILE );
log.info("存在しないファイルの読取りが正常に終了しました");
}catch( ApplicationException e ){
log.severe("例外が発生したため処理を異常終了しました。");
log.log( Level.SEVERE , "例外内容:" , e );
}
}
/**
* ファイルの読見込み処理
* @param filePath 読み込むファイルのエラー
* @throws ファイルの読み込みエラー、対応していない文字コードエラー、ファイルclose時
*/
private void fileReadSample( String filePath ) throws ApplicationException {
//アプリケーションが動作するPCに保存されているファイル
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
log.info("STEP1 init Stream");
fis = new FileInputStream( filePath );
isr = new InputStreamReader( fis , JavaTrySample.FILE_ENCODING );
br = new BufferedReader( isr );
log.info("STEP2 loop start");
String line;
while ( ( line = br.readLine() ) != null ) {
System.out.println(line);
}
log.info("STEP3 try block end.");
} catch (FileNotFoundException e) {
log.log( Level.SEVERE , "指定されたファイル{0}が存在しません。" , new String[]{ filePath } );
log.log( Level.SEVERE , "例外内容:" , e );
throw new ApplicationException( e );
} catch (UnsupportedEncodingException e) {
String[] params = { filePath , JavaTrySample.FILE_ENCODING };
log.log( Level.SEVERE , "指定されたファイル{0}の文字コードが、{1}ではありません。" , params );
log.log( Level.SEVERE , "例外内容:" , e );
throw new ApplicationException( e );
} catch (IOException e) {
log.log( Level.SEVERE , "指定されたファイル{0}読取時に例外が発生しました。" , new String[] { filePath } );
log.log( Level.SEVERE , "例外内容:" , e );
throw new ApplicationException( e );
} finally {
try{
if( br != null ){
br.close();
}
if( isr != null ){
isr.close();
}
if( fis != null ){
fis.close();
}
log.info("STEP4 finally block end.");
} catch ( IOException e ){
log.log( Level.SEVERE , "指定されたファイル{0}のclose時に例外が発生しました。" , new String[]{ filePath } );
log.log( Level.SEVERE , "例外内容:" , e );
throw new ApplicationException( e );
}
}
}
/**
* javaコマンドから実行されるmainメソッド
* @param args コマンド引数(不要)
*/
public static final void main( String[] args){
JavaTrySample sample = new JavaTrySample();
sample.execAllSample();
}
}
ApplicationException.java
package jp.co.yourcompany.education.exception;
/**
* 例外クラスのサンプル
* @author raita.kuwabara
*/
public class ApplicationException extends Exception{
/**
* デフォルトコンストラクタ
*/
public ApplicationException() {
super();
}
/**
* デフォルトコンストラクタ
* @param e 例外
*/
public ApplicationException( Throwable e) {
super( e );
}
}
例外クラスは、java.lang.Exceptionクラスを継承して作成します。
高度なクラス設計ができ、システム独自の例外クラスを作成する場合には、
java.lang.Throwableインターフェイスをimplementsして例外を作成します。
本頁で示したthrowsの概要図で説明します。