【Java】NumberFormatExceptionの原因と対策

【Java】NumberFormatExceptionの原因と対策

JavaのNumberFormatExceptionは、数値の文字列を適切な数値型に変換できない場合にスローされるランタイム例外です。この例外は、プログラムが文字列を数値型に変換しようとしたときに、文字列が数値として認識できない場合に発生します。

以下では、原因例外が発生する例例外の回避方法、および応用例について詳しく解説します。

原因

NumberFormatExceptionが発生する主な原因は以下の通りです。

  • 不正な形式の文字列: 数値に変換できない文字列が渡された場合。
  • 空の文字列: 変換しようとする文字列が空文字列の場合。
  • null値: 文字列がnullの場合。
  • 基数エラー: 基数(radix)が指定されている場合に、文字列がその基数に適合しない場合。

例外が発生する例

以下はNumberFormatExceptionが発生する典型的な例です。

1. 不正な文字列形式

String invalidNumber = "123abc";
int result = Integer.parseInt(invalidNumber); // NumberFormatExceptionが発生

この例では、文字列に数字以外の文字(abc)が含まれているため、例外が発生します。

2. 空の文字列

String emptyString = "";
int result = Integer.parseInt(emptyString); // NumberFormatExceptionが発生

空文字列は数値に変換できないため、例外がスローされます。

3. null値

String nullString = null;
int result = Integer.parseInt(nullString); // NumberFormatExceptionが発生

文字列がnullの場合も例外がスローされます。

4. 基数エラー

String numberInBinary = "102"; // 2進数に不正な文字列
int result = Integer.parseInt(numberInBinary, 2); // NumberFormatExceptionが発生

この例では、基数を2(2進数)に指定していますが、文字列に2が含まれているため無効です。

例外の回避方法

NumberFormatExceptionを回避するための方法を以下に示します。

1. 入力文字列の検証

数値文字列の形式を事前に検証することで、例外を防ぐことができます。

String input = "123";
if (input.matches("\\d+")) { // 数字のみで構成されているかチェック
    int result = Integer.parseInt(input);
} else {
    System.out.println("Invalid number format");
}

2. 例外処理を利用

例外が発生する可能性がある場合は、try-catchブロックを使用して適切に処理します。

try {
    String input = "123abc";
    int result = Integer.parseInt(input);
} catch (NumberFormatException e) {
    System.out.println("Invalid number format: " + e.getMessage());
}

3. デフォルト値の使用

変換が失敗した場合にデフォルト値を使用する方法です。

String input = "abc";
int result;
try {
    result = Integer.parseInt(input);
} catch (NumberFormatException e) {
    result = 0; // デフォルト値
}

4. Apache Commons Langの使用

ライブラリを使用すると、数値変換の安全性を高めることができます。

import org.apache.commons.lang3.math.NumberUtils;

String input = "123";
int result = NumberUtils.toInt(input, 0); // デフォルト値を指定可能

応用例

以下は、実際のプログラムでNumberFormatExceptionを適切に処理する例です。

ユーザー入力を処理するプログラム

import java.util.Scanner;

public class NumberInputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a number: ");
        String input = scanner.nextLine();
        
        try {
            int number = Integer.parseInt(input);
            System.out.println("You entered: " + number);
        } catch (NumberFormatException e) {
            System.out.println("Invalid number format. Please enter a valid integer.");
        }
    }
}

JSONデータから数値を取得

import org.json.JSONObject;

public class JsonNumberExample {
    public static void main(String[] args) {
        String jsonString = "{ \"value\": \"123abc\" }";
        JSONObject json = new JSONObject(jsonString);
        
        try {
            int value = Integer.parseInt(json.getString("value"));
            System.out.println("Value: " + value);
        } catch (NumberFormatException e) {
            System.out.println("Invalid number in JSON: " + e.getMessage());
        }
    }
}

まとめ

NumberFormatExceptionは数値変換時に発生する一般的な例外ですが、入力データの検証や例外処理を適切に行うことで回避できます。また、外部ライブラリを活用することで安全性を高めることも可能です。プログラムの要件に応じて適切な回避策を選択しましょう。

原因に戻る | 例外の例に戻る | 回避方法に戻る | 応用例に戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です