第4章: Javaの例外処理

4.1 例外とは何か

プログラムを実行している間に、予期せぬ事態やエラーが発生することがあります。例えば、ファイルを読み込もうとした際にファイルが存在しない場合や、数値の0で割ろうとした場合などが考えられます。このような異常事態は「例外」と呼ばれ、例外が発生すると通常、プログラムの実行は停止します。

Javaでは、例外の発生を検出し、適切に処理するための「例外処理」機能が提供されています。この機能を使用することで、エラーが発生した場合でもプログラムが適切に動作するように制御できます。


4.2 例外の基本

Javaの例外処理には、主に次の3つのキーワードが使用されます:

  • try: 例外が発生する可能性のあるコードを囲むブロック。
  • catch: 発生した例外をキャッチし、適切に処理するブロック。
  • finally: 例外の発生に関係なく、必ず実行されるコードブロック。

以下に、try-catch構文の基本的な構造を示します。

try {
// 例外が発生する可能性のある処理
} catch (ExceptionType e) {
// 例外が発生した場合の処理
} finally {
// 必ず実行される処理
}

4.2.1 try-catch構文

try-catch構文は、Javaにおいて例外を処理する基本的な方法です。tryブロック内に記述されたコードが実行され、例外が発生した場合は、catchブロック内の処理が実行されます。これにより、プログラムが予期せぬエラーでクラッシュするのを防ぎ、エラーに対して適切な対処を行えます。

例: 数値を0で割った場合の例外処理

public class ExceptionExample {
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
System.out.println("エラー: " + e.getMessage());
}
}

public static int divide(int numerator, int denominator) {
return numerator / denominator;
}
}

上記のコードでは、divideメソッドで0で割ろうとすると、ArithmeticExceptionという例外が発生します。この例外はcatchブロックで捕捉され、エラーメッセージが出力されます。catchブロックがなければ、プログラムはクラッシュしますが、try-catch構文を使うことで、適切にエラーを処理できるようになります。


4.3 throw構文

throw構文は、プログラム内で意図的に例外を発生させるために使用されます。例えば、メソッド内で特定の条件が満たされない場合に、例外を投げることで、呼び出し元にエラーが発生したことを通知できます。

例: 数値が負の値である場合に例外を投げる

public class NegativeNumberExceptionExample {
public static void main(String[] args) {
try {
int result = squareRoot(-10);
System.out.println("Result: " + result);
} catch (IllegalArgumentException e) {
System.out.println("エラー: " + e.getMessage());
}
}

public static int squareRoot(int number) {
if (number < 0) {
throw new IllegalArgumentException("負の数の平方根は計算できません。");
}
return (int)Math.sqrt(number);
}
}

この例では、squareRootメソッドで負の数が渡された場合にIllegalArgumentExceptionthrowしています。throwされた例外はcatchブロックで捕捉され、エラーメッセージが表示されます。


4.4 カスタム例外の作成

Javaでは、独自の例外クラスを作成することができます。これを「カスタム例外」と呼び、特定の条件や状況に合わせて独自のエラーメッセージやエラー処理を行う際に有用です。

カスタム例外の作成方法

カスタム例外クラスを作成するには、ExceptionクラスまたはRuntimeExceptionクラスを継承します。通常、Exceptionクラスを継承したカスタム例外はチェック例外、RuntimeExceptionクラスを継承したカスタム例外は非チェック例外となります。

例: 負の数を入力した場合のカスタム例外

class NegativeNumberException extends Exception {
public NegativeNumberException(String message) {
super(message);
}
}

上記のコードでは、NegativeNumberExceptionというカスタム例外を作成しました。この例外は、負の数が入力された場合に使用されることを想定しています。

カスタム例外の使用例

次に、このNegativeNumberExceptionを用いたコード例を示します。

public class CustomExceptionExample {
public static void main(String[] args) {
try {
int result = factorial(-5);
System.out.println("Result: " + result);
} catch (NegativeNumberException e) {
System.out.println("エラー: " + e.getMessage());
}
}

public static int factorial(int number) throws NegativeNumberException {
if (number < 0) {
throw new NegativeNumberException("負の数の階乗は計算できません。");
}
int result = 1;
for (int i = 1; i <= number; i++) {
result *= i;
}
return result;
}
}

このコードでは、factorialメソッドが負の数を受け取ると、NegativeNumberExceptionthrowされます。メインメソッドでは、この例外をcatchブロックでキャッチし、エラーメッセージを表示します。このように、カスタム例外を使用することで、より詳細で分かりやすいエラーメッセージを提供することができます。


4.5 finallyブロック

finallyブロックは、例外が発生したかどうかに関係なく、必ず実行されるコードブロックです。通常、ファイルのクローズ処理やデータベース接続の解放など、リソースの後処理に使用されます。

例: ファイルの読み取りとfinallyブロックの使用

import java.io.*;

public class FinallyExample {
public static void main(String[] args) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("ファイルの読み込み中にエラーが発生しました。");
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
System.out.println("リソース解放中にエラーが発生しました。");
}
}
}
}

上記のコードでは、BufferedReaderを使ってファイルを読み込んでいますが、ファイルのクローズ処理をfinallyブロックで行っています。これにより、例外が発生した場合でも、ファイルが確実にクローズされるようになります。


4.6 例外処理のベストプラクティス

Javaで例外処理を行う際の一般的なベストプラクティスをいくつか紹介します。

  1. 適切な例外をキャッチする: 例外をキャッチする際は、特定の例外クラスを使用し、一般的なExceptionクラスでキャッチするのは避けましょう。
  2. 例外の再スロー: 必要に応じて、例外を再スローすることで、呼び出し元に例外情報を伝えることができます。
  3. ログを取る: 例外が発生した場合は、エラーログを記録し、トラブルシューティングに役立てましょう。

まとめ

この章では、Javaの例外処理の基本からカスタム例外の作成方法までを詳しく解説しました。適切な例外処理を行うことで、プログラムの信頼性を向上させ、ユーザーにとって快適な動作を提供できるようになります。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

Related Post

第1章: Javaの導入第1章: Javaの導入

1.1 Javaの概要 1.1.1 プログラミングの基礎 プログラミングとは、コンピュータに特定の命令を与え、目的のタスクを実行させる技術です。プログラムを書くことにより、複雑な計算やデータの処理、ゲームの作成、ウェブア […]

第2章: Javaの基本構文第2章: Javaの基本構文

2.1 データ型と変数 Javaでは、データの種類を明示的に定義する「データ型」と、そのデータを格納する「変数」を使用します。Javaのデータ型には、メモリの効率性やデータの取り扱いのために定義された「プリミティブ型」と […]