こんにちは。まるです。
研修は基本リモートで行っているのですが、
最近飼い猫がPCのキーボードの上が良い感じに温かいことに気が付いてしまったようで、乗せろ乗せろと割り込んできます。
可愛いのは良いのですが、頻繁にCapsLookをオンにしてくるので止めて頂きたいところです。
さて、Java振り返り第四回目は例外についてです。
例外とは、プログラムの実行を妨げるような異常事態のことです。
例えば、必要なメモリ領域が確保出来なかった場合や、存在しないファイルを開こうとした場合などなど…そういった異常事態が発生してしまった場合に実行される処理を「例外処理」と呼びます。
Javaでは例外を大きく分けて以下の三種類に分けており、それぞれに対して例外クラスが用意されています。
Error | 重大かつ回復不能な事象。プログラム側での対応は基本的に不可能のため、例外処理は不要。 |
Exception | 回復の見込みがある事象。例外処理が必須。 |
RuntimeException | 回復の見込みはあるが、必ずしも対処が必要ではない事象。例外処理は任意。 |
例外の分類に記述した通り、Exception系の例外を発生させる可能性がある場合には例外処理が必ず必要です。
Javaの例外処理ではtry-catch文という構文を利用します。
という訳で、実際に利用例を書いてみました。
public class Main { public static void main(String[] args) { //配列を作成 int[] numbers = {100, 200, 300}; //try-catch-finally文 try { //実行する処理 System.out.println(numbers[3]); } catch(ArrayIndexOutOfBoundsException e) { //例外発生時の処理 System.out.println("配列の範囲外です"); } finally { //最後に必ず実行する処理 System.out.println("処理を終了します"); } } }
【実行結果】
配列の範囲外です
処理を終了します
上記のコードでは、まずint型配列のnumbersを作成し、try文の中でその配列の添え字[3]の要素を表示する処理を実行しようとしています。
ですが、numbersには要素が三つしか格納されていないため、添え字は[2]までしか存在しません。
try-catch文を利用せずにこのような処理を実行すると、以下のようなエラーが出ます。
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at Main.main(Main.java:9)
ArrayIndexOutOfBoundsExceptionというのは、不正なインデックス(添え字)の要素にアクセスしようとした際にスローされる例外です。
catch文では、try文に記述された処理を実行した際に例外が発生した場合に行う処理を記述します。catchの後ろの()には例外の型と引数を設定します。
今回の場合は、「”ArrayIndexOutOfBoundsException”という例外が発生したら、その例外の情報を変数”e”に格納し、catchの{}の中の処理を実行します」という感じです。
最後のfinally文は、例外の発生有無に関わらず必ず実行する処理を記述します。
今回は例外が発生したため、catch文の処理を実行した後、finally文の処理を実行しています。
例外の発生有無に関わらず実行が必要な処理が無ければ、finally文は省略可能です。
しつこいようですが、Exception系の例外を発生させる可能性がある場合には例外処理としてtry-catch文を記述する必要があります。
ですが、例外処理は必ずしも例外を発生させる処理と同じメソッドで行わなければいけない訳ではありません。
import java.io.File; import java.io.FileReader; import java.io.IOException; public class Test { public static void file(String fileName) throws IOException { //ファイルを宣言 File file = new File(fileName); //ファイルを開く(IOExceptionが発生する可能性有) FileReader filereader = new FileReader(file); } }
FileReaderクラスのコンストラクタを実行すると、「IOException」という例外が発生し、この例外はExceptionクラスを継承しているため例外処理が必須です。
※どのクラスのどのメソッドがどんな例外を発生させる可能性があるかについては、APIリファレンスで確認可能です。FileReaderクラスのリファレンスはこちら。
上記の例では、6行目で発生した例外を呼び出し元へ投げる処理を行っています。「throws IOException」というところです。※”thorw”ではないので注意!
このように、throws文を利用することで、例外処理を呼び出し元に任せることが出来、そのメソッド上では例外処理が必須ではなくなります。
逆に、throws文のついたメソッドを呼び出すメソッドでは、例外処理を行う義務が発生します。
普段はeclipseを使ってコードを書いており大抵の記述ミスは教えて貰えるので大変助かっているのですが、試験となるとそうもいかないので、今後の資格取得に向けて今一度構文のルールから見直しておきたいと思います。
今回はここまでです。
有難うございました!