1. 개요

때  자바 변환 문자열 A와 더블 ,  우리는 일반적으로 사용합니다  사용해 Double.parseDouble (문자열 값)  방법을. 이 방법을 사용하면  주어진 double ( 예 : "2.0") 의  문자열 표현을  원시 double  값으로 변환 할 수 있습니다.

대부분의 메서드 호출과 마찬가지로  런타임에 NullPointerException 이 발생할 가능성이 있는 null 참조를  전달하지 않는 것이 좋습니다 .

이 사용방법(예제)에서는 Double.parseDouble 을 호출하기 전에 null을  확인할 수있는 여러 방법을 살펴  봅니다. 일부 외부 라이브러리를 살펴보기 전에 핵심 Java를 사용하는 솔루션을 고려하는 것으로 시작하겠습니다.

2. 확인하는 이유

먼저 S tring을 구문 분석 할 때 null 값을 확인하지 않으면 어떤 일이 발생하는지 이해합시다 . 문자열 을 전달하는 것으로 시작하겠습니다 .

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. Core Java로 확인하는 방법

이 섹션에서는 핵심 Java를 사용하여 null 또는 빈 값 을 확인하는 몇 가지 옵션을 살펴 보겠습니다 .

3.1. Vanilla 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. 옵션 사용

이제 Optional을 사용 하여 다른 솔루션을 살펴 보겠습니다 .

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

이번에는 Optional반환 유형 으로 사용 합니다 . 따라서이 메서드를 호출하면 isPresent ()isEmpty ()같은 표준 메서드를 호출 하여 값이 있는지 확인할 수 있습니다.

parseStringToOptionalDouble("2").isPresent()

OptionalorElse 메서드를 사용하여 기본값을 반환 할 수도 있습니다 .

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

4. 외부 라이브러리

이제 핵심 Java를 사용하여 null 및 빈 값 을 확인하는 방법을 잘 이해 했으므로 일부 외부 라이브러리를 살펴 보겠습니다.

4.1. Google Guava

우리가 살펴볼 첫 번째 외부 솔루션 Maven Central에서 사용할 수있는 Google Guava입니다 .

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

Doubles.tryParse 메서드 를 사용하면 됩니다 .

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

이 예제에서는 MoreObjects.firstNonNull 메서드 도 사용합니다.이 메서드는 null 이 아닌 두 개의 주어진 매개 변수 중 첫 번째 매개 변수를 반환합니다 .

이 코드는 대부분의 경우 잘 작동하지만 다른 예를 생각해 봅시다.

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

이 경우 빈 문자열null 이 아니기 때문에 메서드는 NumberFormatException 을 던지는 대신 null 을 반환 합니다. 예외는 피하지만 애플리케이션 코드의 어느 시점에서 여전히 null을 처리해야 합니다.

4.2. Apache Commons Lang NumberUtils

NumberUtils의 클래스는 쉽게 숫자와 함께 작동 할 수 있도록 많은 유용한 유틸리티를 제공합니다.

아파치 코 몬즈 랭의  유물에서 사용할 수  메이븐 중앙 :

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

그런 다음 NumberUtils  에서  toDouble 메소드를 사용하면됩니다  .

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

여기에는 두 가지 옵션이 있습니다.

  • 개종자 문자열 A와 더블 , 반환 0.0d 변환이 실패 할 경우
  • 개종자 문자열 A와 더블 변환이 실패 할 경우 정의 된 디폴트 값을 제공

비어 있거나 null을 전달하면 기본적으로 0.0d 가 반환됩니다.

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

변환 중에 어떤 일이 발생하더라도 항상 이중 반환 값을 얻으므로 이전 예제보다 좋습니다 .

4.3. Vavr

마지막 으로 기능적 접근 방식을 제공하는 vavr.io를 살펴 보겠습니다 .

항상 그렇듯이 Maven Central 에서 유물을 찾을 수 있습니다 .

<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에서 사용할 수  있습니다 .