例外処理
operationではなく、どうしても例外処理を行いたい場合もあるだろう。その時はtry〜catch〜finallyを記述できる。ただ、お馴染みのJavaの構文とは少し異なる。リスト2-3の後半がその例だ。リスト2-4のようにoperation内で記述することもできる。
リスト2-1の関数sumは引数が数値でなければ実行できない。そこで例外がスローされた場合はメッセージを表示するようにしている。catch節に記述されたexはThrowableやExceptionおよびそのサブクラスではなく、getMessage()やprintStackTrace()などのメソッドは実行できないので注意が必要だ。
リスト2-3 例外処理
function sum( n ) {
// ..... リスト2-1参照 .....
}
try {
println( sum( '1からnまでの総和' ) ); ← 実行されない(例外がスローされる)
} catch( ex ) {
println( '引数は数値にしてください' ); ← 実行される
} finally {
println( sum( 10 ) ); ← 実行される
}
リスト2-4 operation内でtry〜catchを記述した例
operation sum(n) {
try {
var ans = n * ( n + 1 ) / 2;
return ans;
} catch( ex ) {
return '引数は数値にしてください';
}
}
printStackTrace()などのメソッドが実行できないと、デバッグには不便だと感じるかもしれない。もしスローされる例外のクラスがわかる場合は、リスト2-5のようにcatch節でクラス名を指定できる。こうすればprintStackTrace()などでデバッグもできるようになる。
このとき、指定する例外のクラスは、たとえjava.langパッケージのものであっても、必ずインポートしておかなくてはならないので注意しよう。また、このリストのcharAt関数では、引数と戻り値のデータ型も同じように指定しているので、こちらにも注目していただきたい。
ちなみに"{ex.message}"はex.getMessage()の値を表す。JavaFXでは、'〜'で囲まれた文字列はそのままの内容で定数とみなされるが、"〜"で囲まれた文字列は、{〜}で囲まれた部分の値を確定したあとの文字列が実際の値となる。
リスト2-5 スローされる例外のクラスがわかる場合
import java.lang.IndexOutOfBoundsException;
// 関数の定義(引数や戻り値のデータ型を指定)
function charAt( s:String, n:Number ) :char {
return s.charAt( n );
}
try {
println( charAt( '文字列の長さ', 1 ) ); ← 「字」
println( charAt( '文字列の長さ', 100 ) ); ← IndexOutOfBoundsExceptionがスローされる
} catch( ex:IndexOutOfBoundsException ) { ← exのクラス名を指定
println( '文字列はもっと短いです' );
println( "{ex.message}" ); ← ex.getMessage()の値を表示
// ex.printStackTrace();
}
次回はクラスと配列について取り上げたい。JavaFXでは宣言型の構文が採用されており、同じのクラスの属性(プロパティ)とメソッドとを別のブロックで定義する、JavaScriptに似たプログラミングが可能だ。配列に関しては、Javaとのあまりの違いに戸惑うかもしれないが、スクリプト言語では一般的な要素が多く取り入れられている。これを機会に新しい世界に繰り出そうではないか。