Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでNumberFormatException(非検査例外)を処理する方法をわかりやすく解説

NumberFormatExceptionは、parseXXX()系のメソッドが文字列を数値に変換できなかった場合にスローされる非検査例外(unchecked exception)です。この例外はコンパイル時に強制されないため、開発者が適切に対処しないと実行時にプログラムが異常終了する原因となります。

java.langパッケージのクラスには、NumberFormatExceptionをスローする可能性のあるメソッドやコンストラクタが多数存在します。代表的なものは以下の通りです。

  • public static int parseInt(String s) throws NumberFormatException
  • public static Byte valueOf(String s) throws NumberFormatException
  • public static byte parseByte(String s) throws NumberFormatException
  • public static byte parseByte(String s, int radix) throws NumberFormatException
  • public Integer(String s) throws NumberFormatException
  • public Byte(String s) throws NumberFormatException

各メソッドごとに、NumberFormatExceptionがスローされる状況が定義されています。たとえばpublic static int parseInt(String s)の場合、次のようなケースで例外が発生します。

  • 文字列sがnullである、または長さが0(空文字)の場合
  • 文字列sに数値以外の文字が含まれている場合
  • 文字列sの値がInteger型として扱える範囲外または不正な形式の場合

例1:NumberFormatExceptionが発生するコード

public class NumberFormatExceptionTest {
    public static void main(String[] args){
        int x = Integer.parseInt("30k");
        System.out.println(x);
    }
}

上記のコードでは、「30k」という文字列に数値以外の文字「k」が含まれているため、変換に失敗し例外がスローされます。

実行結果

Exception in thread "main" java.lang.NumberFormatException: For input string: "30k"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:580)
        at java.lang.Integer.parseInt(Integer.java:615)
        at NumberFormatExceptionTest.main(NumberFormatExceptionTest.java:3)

NumberFormatExceptionへの対処方法

NumberFormatExceptionは主に次の2つの方法で処理できます。

  • try-catchブロックで、例外が発生する可能性のあるコードを囲んで捕捉する
  • throwsキーワードを使って、例外を呼び出し元のメソッドへ委譲する

例2:try-catchとthrowsを組み合わせた処理

public class NumberFormatExceptionHandlingTest {
    public static void main(String[] args) {
        try {
            new NumberFormatExceptionHandlingTest().intParsingMethod();
        } catch (NumberFormatException e) {
            System.out.println("We can catch the NumberFormatException");
        }
    }
    public void intParsingMethod() throws NumberFormatException{
        int x = Integer.parseInt("30k");
        System.out.println(x);
    }
}

この例では、intParsingMethod()メソッド内でInteger.parseInt("30k")によってスローされた例外オブジェクトが、throws宣言によって呼び出し元のmain()メソッドへ渡されます。そしてmain()側のcatchブロックで例外を受け止め、プログラムが異常終了せずに処理を継続できます。

実行結果

We can catch the NumberFormatException

このように、ユーザー入力や外部データを数値に変換する場面では、事前に文字列の形式を検証するか、try-catchによる例外処理を組み込むことで、堅牢なJavaアプリケーションを実現できます。

  1. JavaでArithmeticException(非検査例外)を処理する方法を徹底解説

    java.lang.ArithmeticExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。実際の開発で最もよく目にするのは「java.lang.ArithmeticException: / by zero」というエラーで、これは2つの数値の除算を行った際に分母がゼロになると発生します。なお、ArithmeticExceptionのオブジェクトはJVMによって自動的に生成されることがあります。 例1:ArithmeticExceptionが発生するコード public class ArithmeticExceptionTest { pu

  2. Javaのランタイム例外(RuntimeException)とは?主な種類と対処法を解説

    ランタイム例外(RuntimeException)とは ランタイム例外(RuntimeException)は、Javaプログラミング言語における各種例外の親クラスであり、発生するとプログラムやアプリケーションがクラッシュ、あるいは異常終了する可能性のある例外群を指します。 チェック例外(検査例外)と異なり、ランタイム例外はコンパイル時のチェック対象外です。そのため、try-catchでの捕捉やthrows宣言が必須ではなく、実行時に初めて表面化することが少なくありません。 ランタイム例外は通常、プログラムが本来対処すべき外部要因ではなく、プログラマーのコーディングミスを示している点が大きな特徴