👻

Java 品質を高める例外処理とマルチキャッチ構文まとめ

2024/11/05に公開

IOException: 入出力操作でエラーが発生した場合にスロー
FileNotFoundException: 指定されたファイルが見つからないときにスロー
SQLException: データベース操作中にエラーが発生した場合にスロー
NumberFormatException: 無効な数値文字列を数値型に変換しようとしたときにスロー
ArithmeticException: 算術演算で不正な操作(例: 0 での除算)をしたときにスロー
ClassCastException: オブジェクトを互換性のない型にキャストしたときにスロー
NullPointerException: null 参照に対してメソッドを呼び出したときにスロー
ReflectiveOperationException: リフレクション操作でエラーが発生したときにスロー

テンプレート 1: ファイル読み込みとマルチキャッチ

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileProcessor {
    public void readFile(String filePath) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(filePath));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException | SecurityException e) {
            System.err.println("ファイル処理中にエラーが発生しました: " + e.getMessage());
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                    System.out.println("リソースが正常に閉じられました");
                }
            } catch (IOException e) {
                System.err.println("リソースのクローズ中にエラーが発生しました: " + e.getMessage());
            }
        }
    }
}

テンプレート 2: データベース接続とマルチキャッチ

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseHandler {
    public void connectToDatabase() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
            System.out.println("データベースに接続しました");
        } catch (SQLException | SecurityException e) {
            System.err.println("データベース接続中にエラーが発生しました: " + e.getMessage());
        } finally {
            try {
                if (conn != null && !conn.isClosed()) {
                    conn.close();
                    System.out.println("データベース接続を閉じました");
                }
            } catch (SQLException e) {
                System.err.println("データベース接続のクローズ中にエラーが発生しました: " + e.getMessage());
            }
        }
    }
}

テンプレート 3: HTTP リクエスト処理とマルチキャッチ


import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpRequestHandler {
    public void sendRequest(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            int responseCode = conn.getResponseCode();
            System.out.println("HTTP レスポンスコード: " + responseCode);
        } catch (MalformedURLException | IllegalArgumentException e) {
            System.err.println("URL が無効です: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("HTTP リクエストの送信中にエラーが発生しました: " + e.getMessage());
        } finally {
            System.out.println("HTTP リクエスト処理が終了しました");
        }
    }
}

テンプレート 4: JSON パース処理

import org.json.JSONException;
import org.json.JSONObject;

public class JsonParser {
    public void parseJson(String jsonString) {
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            System.out.println("JSON の解析に成功しました: " + jsonObject.toString(2));
        } catch (JSONException e) {
            System.err.println("JSON パースエラー: " + e.getMessage());
        } finally {
            System.out.println("JSON 処理が完了しました");
        }
    }
}

テンプレート 5: ファイル書き込みとマルチキャッチ


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterHandler {
    public void writeFile(String filePath, String content) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            writer.write(content);
            System.out.println("ファイルに書き込みました");
        } catch (IOException | SecurityException e) {
            System.err.println("ファイル書き込み中にエラーが発生しました: " + e.getMessage());
        } finally {
            System.out.println("ファイル書き込み処理が完了しました");
        }
    }
}

テンプレート 6: ユーザー入力の検証

import java.util.Scanner;

public class InputValidator {
    public void validateUserInput() {
        Scanner scanner = new Scanner(System.in);
        try {
            System.out.print("整数を入力してください: ");
            int number = Integer.parseInt(scanner.nextLine());
            System.out.println("入力された数値: " + number);
        } catch (NumberFormatException | IllegalStateException e) {
            System.err.println("無効な入力です: " + e.getMessage());
        } finally {
            scanner.close();
            System.out.println("入力処理が完了しました");
        }
    }
}

テンプレート 7: API レスポンスの処理

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ApiHandler {
    public void getApiResponse(String endpoint) {
        try {
            URL url = new URL(endpoint);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                System.out.println("API レスポンス: " + response.toString());
            }
        } catch (IOException | SecurityException e) {
            System.err.println("API 呼び出し中にエラーが発生しました: " + e.getMessage());
        } finally {
            System.out.println("API 呼び出し処理が完了しました");
        }
    }
}

テンプレート 8: リフレクションと例外処理

import java.lang.reflect.Method;

public class ReflectionHandler {
    public void invokeMethod(String className, String methodName) {
        try {
            Class<?> clazz = Class.forName(className);
            Method method = clazz.getMethod(methodName);
            method.invoke(clazz.getDeclaredConstructor().newInstance());
            System.out.println("メソッドの呼び出しが成功しました");
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            System.err.println("クラスまたはメソッドが見つかりません: " + e.getMessage());
        } catch (ReflectiveOperationException e) {
            System.err.println("リフレクション中にエラーが発生しました: " + e.getMessage());
        } finally {
            System.out.println("リフレクション処理が完了しました");
        }
    }
}

【参考】

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/Exception.html

Discussion