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