1. 概要

いつ Java文字列をdoubleに変換する 通常は Double.parseDouble(文字列値) 方法。 このメソッドを使用すると、与えられたの表現ダブル –たとえば、「2.0」–プリミティブへダブル価値。

ほとんどのメソッド呼び出しと同様に、 ヌル 参照、これはおそらく結果として NullPointerException 実行時。

このチュートリアルでは、nullをチェックするいくつかの方法を探ります。Double.parseDoubleを呼び出す前。 いくつかの外部ライブラリを検討する前に、コアJavaを使用したソリューションを検討することから始めます。

2. チェックする理由

まず、Stringを解析するときにnull値をチェックしないとがどうなるかを理解しましょう。 空のStringを渡すことから始めましょう。

double emptyString = Double.parseDouble("");

このコードを実行すると、java.lang.NumberFormatExceptionがスローされます。

Exception in thread "main" java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.lang.Double.parseDouble(Double.java:538)
	...

次に、null参照を渡すことを検討しましょう。

double nullString = Double.parseDouble(null);

当然のことながら、今回はjava.lang.NullPointerExceptionがスローされます。

Exception in thread "main" java.lang.NullPointerException
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.lang.Double.parseDouble(Double.java:538)
	...

ご存知のように、アプリケーションコードで例外を使用することをお勧めします。 ただし、一般的に、は、プログラミングエラーの結果である可能性が高いこれらの種類のチェックされていない例外を回避する必要があります。

3. CoreJavaで確認する方法

このセクションでは、コアJavaを使用してnullまたは空の値をチェックするためのいくつかのオプションを見ていきます。

3.1. バニラJavaを使用する

渡す値がnullか空のStringかをチェックする簡単なメソッドを定義することから始めましょう。

private static double parseStringToDouble(String value) {
    return value == null || value.isEmpty() ? Double.NaN : Double.parseDouble(value);
}

ご覧のとおり、解析しようとしている値が null であるか空の場合、このメソッドは数値ではなくを返します。 それ以外の場合は、Double.parseDoubleメソッドを呼び出します。

この例をさらに一歩進めて、事前定義されたデフォルトを提供する可能性を提供できます。

private static double parseStringToDouble(String value, double defaultValue) {
    return value == null || value.isEmpty() ? defaultValue : Double.parseDouble(value);
}

このメソッドを呼び出すとき、指定された値がnullまたは空の場合に返す適切なデフォルトを指定します。

assertThat(parseStringToDouble("1", 2.0d)).isEqualTo(1.0d);
assertThat(parseStringToDouble(null, 1.0d)).isEqualTo(1.0d);
assertThat(parseStringToDouble("", 1.0d)).isEqualTo(1.0d);

3.2. オプションを使用

次に、オプションの使用法を使用した別のソリューションを見てみましょう。

private static Optional parseStringToOptionalDouble(String value) {
    return value == null || value.isEmpty() ? Optional.empty() : Optional.of(Double.valueOf(value));
}

今回は、[X43X]オプションをリターンタイプとして使用しています。 したがって、このメソッドを呼び出すと、 isPresent() isEmpty()などの標準メソッドを呼び出して、値が存在するかどうかを判断できます。

parseStringToOptionalDouble("2").isPresent()

オプションまたはElseメソッドを使用してデフォルト値を返すこともできます。

parseStringToOptionalDouble("1.0").orElse(2.0d) 
parseStringToOptionalDouble(null).orElse(2.0d) 
parseStringToOptionalDouble("").orElse(2.0d)

4. 外部ライブラリ

コアJavaを使用してnullと空の値をチェックする方法を十分に理解したので、いくつかの外部ライブラリを見てみましょう。

4.1. Google Guava

最初に検討する外部ソリューションは、 Google Guava で、 MavenCentralで利用できます。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Doubles.tryParseメソッドを使用するだけです。

Doubles.tryParse(MoreObjects.firstNonNull("1.0", "2.0"))
Doubles.tryParse(MoreObjects.firstNonNull(null, "2.0"))

この例では、 MoreObjects.firstNonNull メソッドも使用します。このメソッドは、nullではない2つの指定されたパラメーターの最初のパラメーターを返します。

このコードはほとんどの場合正常に機能しますが、別の例を想像してみましょう。

Doubles.tryParse(MoreObjects.firstNonNull("", "2.0"))

この場合、空のStringnullではないため、メソッドは NumberFormatException をスローする代わりに、nullを返します。 例外を回避しますが、アプリケーションコードのある時点でnull値を処理する必要があります。

4.2。 Apache Commons Lang NumberUtils

NumberUtils クラスは、数値の操作を容易にする多くの便利なユーティリティを提供します。

Apache Commons Lang アーティファクトは、 MavenCentralから入手できます。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

次に、NumberUtilsのメソッドtoDoubleを使用できます。

NumberUtils.toDouble("1.0")
NumberUtils.toDouble("1.0", 1.0d) 

ここでは、2つのオプションがあります。

  • Stringdoubleに変換し、変換が失敗した場合は0.0dを返します
  • Stringdoubleに変換し、変換が失敗した場合に定義されたデフォルト値を提供します

空の値またはnullの値を渡すと、デフォルトで0.0dが返されます。

assertThat(NumberUtils.toDouble("")).isEqualTo(0.0d);
assertThat(NumberUtils.toDouble(null)).isEqualTo(0.0d);

これは、変換中に何が起こっても常に double の戻り値を取得するため、前の例よりも優れています。

4.3. Vavr

最後になりましたが、機能的なアプローチを提供するvavr.ioを見てみましょう。

いつものように、アーティファクトは MavenCentralにあります。

<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.10.2</version>
</dependency>

ここでも、vavr Tryクラスを利用する簡単なメソッドを定義します。

public static double tryStringToDouble(String value, double defaultValue) {
    return Try.of(() -> Double.parseDouble(value)).getOrElse(defaultValue);
}

このメソッドは、他の例とまったく同じ方法で呼び出します。

assertThat(tryStringToDouble("1", 2.0d)).isEqualTo(1.0d);
assertThat(tryStringToDouble(null, 2.0d)).isEqualTo(2.0d);
assertThat(tryStringToDouble("", 2.0d)).isEqualTo(2.0d);

5. 結論

このクイックチュートリアルでは、 Double.parseDouble メソッドを呼び出す前に、nullと空の文字列をチェックするいくつかの方法を検討しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。