ブログ移転?しました エックスサーバを契約してみたので、 いろいろカスタマイズできそうなWordPressを使って ブログを作ってみました。 https://gametech.vatchlog.com/ 多分こちらでも同じような記事を書いていくと思います。 忍者ブログ

ばちブロ

プログラミングとか徒然を書いていた(過去形)

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【JAVA】try-catch-finallyの謎


さて、今回は例外処理の謎についてちょっとまとめてみます。

簡単に実装できる例外処理にtry-catch構文がありますね。
また、それにfinallyというブロックを追加することができるのですが、
前々から

「このfinallyって要るんかいな?」

と思っていました。


というわけで、このfinallyブロックについて調べてみました。


さて、早速サンプルソースを見てみましょう。


int n[] = {18, 29, 36};

System.out.println("開始します");

try
{
for (int i = 0; i < 4; i++)
{
System.out.println(n[i]);
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("配列の範囲を超えています");
}
finally
{
System.out.println("配列の出力を終了しました");
}

System.out.println("終了しました");





さて、これはどういうコードなのでしょうか。

まず、tryブロック内でforループによりint型の配列を参照します。
その中で例外が発生した場合、catchブロック内の処理を行います。
そして最終的に、例外が起きても起きなくてもfinallyブロックの処理を行います。

そしてfinallyブロックの処理終了後に最終行の処理を行います。

とても単純ですね。

しかし、お気づきの方もいると思いますが、
これ、実は以下のように書き換えても問題なく同じように動作します。


int n[] = {18, 29, 36};

System.out.println("開始します");

try
{
for (int i = 0; i < 4; i++)
{
System.out.println(n[i]);
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("配列の範囲を超えています");
}
System.out.println("配列の出力を終了しました");
System.out.println("終了しました");





このように、finallyブロックを削除しても、同様に動作します。

ここである疑問が浮かび上がります。

try-catchブロック処理が終了したあとに何かの処理を行うのに、
finallyブロックは必要ないのではないか?

確かに、try-catch処理を行ったあとに何か処理をしたければ、
そのブロックのあとに処理したいものを書き込めばいいんですから。

というわけでちょっと調べてみました。
すると、以下のような場合にfinallyブロックが活躍するらしいです。



int n[] = {18, 29, 36};

System.out.println("開始します");

try
{
for (int i = 0; i < 4; i++)
{
System.out.println(n[i]);
}
return n[0];
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("配列の範囲を超えています");
return -1;
}
finally
{
System.out.println("配列の出力を終了しました");
}

System.out.println("終了しました");




さて、今度はtry-catchブロック内に値を戻す処理が追加されました。
こうなると、どうやら勝手が違うみたいです。

このような、ブロック内で値を戻すような処理が行われると、
通常はその時点でメソッド内の処理を終えてしまうのですが、
処理を続けたい場合finallyブロックで処理を書けるみたいです。

実際に使ったことはないので分かりませんが。



というわけで、finallyには一応存在意義があるみたいですね。
例外を投げることによって、finallyで拾って、値を戻しながら処理を行うとかそういうトリッキーな使い方ができるかもですね。

まぁ、例外処理は動作が重いのであまり多用しないほうがいいのですがね。

拍手[0回]

PR