初心者のためのJavaプログラミング再学習(その2 例外処理(1))

| 2 min read
Author: hiroaki-taka hiroaki-takaの画像

はじめに

#

「初心者のためのJavaプログラミング再学習」の第2回目の記事です。この連載では、Javaプログラミングを網羅的にカバーするのではなく、新人研修等で躓く受講者が多い部分、一度勉強したけど理解が難しい部分に絞って執筆する予定です。

前回の記事は以下になります。
初心者のためのJavaプログラミング再学習(その1 基本データ型とオブジェクト型)

今回は「例外処理」について解説します。

例外の基本

#

例外とは?

#

例外処理の前に、そもそも例外とはどのようなものでしょうか。
辞書によれば、以下のように定義されています。

例外とは

通例にあてはまらないこと。一般原則の適用を受けないこと。また、そのもの。
(デジタル大辞泉より引用)

辞書の記載では、ちょっとイメージがしにくいかもしれませんね。
通例にあてはまらないということは、想定していた通常の利用ケースとは外れた利用方法や、前提が外れた状態での利用方法と考えることができます。
例えば、以下のような感じでしょうか。

  • コピー機で用紙がない、またはトナーがない状態で印刷しようとする
  • 自動販売機で売り切れの商品を買おうとする

例外処理とは?

#

前述のコピー機や自動販売機の例では、そのままだとコピー機の中がトナーまみれになったり、自動販売機にお金だけ入れてほしい商品が買えなかったり、利用者にとって不利益な状況になりかねません。

そこで、利用者が不利益を被らないようにするため、システム側で事前に対処することが必要になります。前述のコピー機や自動販売機の例では、以下のようになるでしょうか?

  • 用紙切れ、トナー切れであることを通知して、印刷を中止する
  • 売り切れた商品は「売切」ランプを点灯させ、その商品のボタンを押さないようにする

つまり、例外処理とは例外が起きたときにしかるべき方法で対処することと捉えることができます。

例外処理の文法

#

一応、プログラムでの記述方法についても触れておきます。
Javaの場合、例外処理の基本形は以下のようになります(今回finallyブロックは省略します)。

try {
//通常の処理を書く
} catch (例外の種類 変数名) {
//例外が発生したときの処理
}

tryブロックの中には、例外が発生するかもしれない処理を記述します。コピー機の例でいえば、印刷開始ということになります。

catchブロックの中には、例外が発生するときに行う処理を記述します。コピー機で用紙切れが例外の種類に相当します。そして、用紙切れであることを通知することが処理となります。なお、catchブロックは複数記述可能です。用紙切れの例外処理を行うcatchブロックと、トナー切れの例外処理を行うcatchブロックというように、catchブロックを2つ並べて記述できます。

例外の種類

#

JavaではExceptionとRuntimeExceptionの2種類の例外があります。すべての例外は、このクラスのどちらかを継承しています。

Exceptionクラス

#

Exceptionクラスを継承する例外は、コンパイル時にその例外に対する例外処理が実装されているかどうかがチェックされます。例外処理が実装されていない(try-catch文がない)場合はコンパイルエラーとなります。入出力関係に問題があった場合などプログラムの外部に問題がある場合、Exceptionクラスを継承した例外が発生します。

RuntimeExceptionクラス

#

RuntimeExceptionクラスを継承する例外は、コンパイル時にその例外に対する例外処理が実装されているかはチェックされません。文法的には、try-catch文を書かなくてもよいということになります。Javaでは、配列の範囲外へのアクセスや不正な演算など、プログラムの内部に問題がある場合、RuntimeExceptionクラスを継承した例外が発生します。

おわりに

#

今回は、例外処理の基本部分について説明しました。

次回は例外処理の伝播など応用的な部分について記載したいと思います。

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み (2022-12-08)
  2. AWS認定資格を12個すべて取得したので勉強したことなどをまとめます (2022-12-12)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  4. Viteベースの高速テスティングフレームワークVitestを使ってみる (2022-12-28)
  5. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  6. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  7. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)
  8. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  9. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する (2023-01-16)
  10. Nuxt3入門(第7回) - Nuxt3のプラグイン・ミドルウェアを使う (2022-10-23)