JavaのNumberFormatExceptionを理解する

1. 前書き

Javaはlink:/java-convert-string-to-intができないときに_NumberFormatException– _ link:/java-exceptions [未チェックの例外] –をスローします-または-integer [_String_を数値型に変換]。
link:/java-exceptions[unchecked]であるため、Javaはそれを処理または宣言することを強制しません。
このクイックチュートリアルでは、* Javaで_NumberFormatException_を引き起こすものと、それを回避または処理する方法*について説明し、デモンストレーションします。

2. _ NumberFormatException _の原因

_ NumberFormatException _を引き起こすさまざまな問題があります。 たとえば、Javaの一部のコンストラクターおよびメソッドはこの例外をスローします。
以下のセクションでそれらのほとんどについて説明します。

* 2.1。 コンストラクターに渡される非数値データ*

非数値データで_Integer_または_Double_オブジェクトを構築する試みを見てみましょう。
これらのステートメントは両方とも_NumberFormatException_をスローします。
Integer aIntegerObj = new Integer("one");
Double doubleDecimalObj = new Double("two.2");
1行目の_Integer_コンストラクターに無効な入力「1」を渡したときに得られたスタックトレースを見てみましょう。
Exception in thread "main" java.lang.NumberFormatException: For input string: "one"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.<init>(Integer.java:867)
    at MainClass.main(MainClass.java:11)
_NumberFormatException_をスローしました。 内部で_parseInt()_を使用して入力を理解しようとしたときに、_Integer_コンストラクターが失敗しました。
Java Number APIは単語を数値に解析しないため、単純に期待値に変更することでコードを修正できます。
Integer aIntegerObj = new Integer("1");
Double doubleDecimalObj = new Double("2.2");

* 2.2。 非数値データを含む文字列の解析*

コンストラクターでの解析に対するJavaのサポートと同様に、_parseInt()、parseDouble()、_ _valueOf()_、および_decode()._のような専用の解析メソッドがあります。
これらと同じ種類の変換を試みた場合:
int aIntPrim = Integer.parseInt("two");
double aDoublePrim = Double.parseDouble("two.two");
Integer aIntObj = Integer.valueOf("three");
Long decodedLong = Long.decode("64403L");
次に、同じ種類の誤った動作が表示されます。
そして、同様の方法で修正できます。
int aIntPrim = Integer.parseInt("2");
double aDoublePrim = Double.parseDouble("2.2");
Integer aIntObj = Integer.valueOf("3");
Long decodedLong = Long.decode("64403");

* 2.3。 無関係な文字を含む文字列を渡す*

または、空白文字や特殊文字などの入力に*余分なデータがある文字列を数値に変換しようとすると:*
Short shortInt = new Short("2 ");
int bIntPrim = Integer.parseInt("_6000");
その後、以前と同じ問題が発生します。
少しの文字列操作でこれらを修正できます。
Short shortInt = new Short("2 ".trim());
int bIntPrim = Integer.parseInt("_6000".replaceAll("_", ""));
int bIntPrim = Integer.parseInt("-6000");
ここで3行目では、マイナス記号としてハイフン文字を使用して、*負の数を使用できます*。

* 2.4。 ロケール固有の数値形式*

ロケール固有の数字の特殊なケースを見てみましょう。 ヨーロッパの地域では、コンマが小数点以下を表す場合があります。 たとえば、「4000,1」は10進数「4000.1」を表します。
デフォルトでは、コンマを含む値を解析しようとすると_NumberFormatException_を取得します。
double aDoublePrim = Double.parseDouble("4000,1");
この場合、コンマを許可し、例外を回避する必要があります。 これを可能にするには、Javaはここでのコンマを10進数として理解する必要があります。
*ヨーロッパ地域ではカンマを使用でき、_NumberFormat_を使用して例外を回避できます。*
フランスの_Locale_を例として使用して、実際に見てみましょう。
NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
Number parsedNumber = numberFormat.parse("4000,1");
assertEquals(4000.1, parsedNumber.doubleValue());
assertEquals(4000, parsedNumber.intValue());

3. ベストプラクティス

_NumberFormatException_に対処するのに役立ついくつかの優れたプラクティスについて話しましょう。
  1. アルファベットや特殊文字を数字に変換しようとしないでください
    Java Number APIではできません。

  2. したいことがあります
    正規表現を使用してlink:/java-check-string-number [入力文字列を検証]し、無効な文字に対して例外をスローします

  3. メソッドで予測可能な既知の問題に対して入力をサニタイズできます
    _trim()_や_replaceAll()_など。

  4. 場合によっては、入力の特殊文字が有効な場合があります。 だから、私たちはやる
    例えば、https://www.baeldung.com/java-double-to-string [numerous formats]をサポートする_NumberFormat、_を使用した特別な処理。

4. 結論

このチュートリアルでは、Javaでの_NumberFormatException_とその原因について説明しました。 この例外を理解すると、より堅牢なアプリケーションを作成するのに役立ちます。
さらに、無効な入力文字列で例外を回避するための戦略を学びました。
最後に、_NumberFormatException_を扱うためのいくつかのベストプラクティスを見ました。
いつものように、例で使用されているソースコードはhttps://github.com/abhijoyful/tutorials/tree/master/core-java-modules/core-java-exceptions[GitHubで]にあります。