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()
Optional 의 orElse 메서드를 사용하여 기본값을 반환 할 수도 있습니다 .
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 및 빈 문자열 을 확인하는 여러 방법을 탐색했습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/java-check-null-parse-double
'Java' 카테고리의 다른 글
Spring RestTemplate 오류 처리 (0) | 2021.03.27 |
---|---|
Spring RestTemplate 인터셉터 사용 (0) | 2021.03.27 |
Java 메서드에서 여러 값을 반환하는 방법 (0) | 2021.03.27 |
자바에서 두 문자열의 차이점 찾기 (0) | 2021.03.26 |
Java의 배열에서 요소 제거 (0) | 2021.03.26 |