본문 바로가기

JAVA/EXCEPTION

NumberFormatException 발생원인과 해결방법

`NumberFormatException`은 자바에서 문자열을 숫자로 변환하려고 할 때 발생하는 예외입니다. 이 예외는 문자열이 올바른 숫자 형식이 아니라면 발생하게 됩니다.

**발생 원인:**
`NumberFormatException`은 주로 다음과 같은 상황에서 발생합니다:

1. **`Integer.parseInt()`, `Double.parseDouble()` 등의 메서드로 문자열을 숫자로 변환할 때**: 숫자로 변환하려는 문자열이 숫자 형식이 아닐 경우 예외가 발생합니다.

   ```java
   String strNumber = "ABC";
   int number = Integer.parseInt(strNumber); // 이 부분에서 NumberFormatException이 발생합니다.
   ```

2. **형변환(Casting)에서 문자열을 숫자로 변환할 때**: 문자열을 숫자 타입으로 강제 형변환(Casting)하려고 할 때, 문자열이 숫자로 변환될 수 없는 경우 예외가 발생합니다.

   ```java
   String strNumber = "123";
   double doubleNumber = (double) strNumber; // 이 부분에서 NumberFormatException이 발생합니다.
   ```

**해결 방법:**
`NumberFormatException`을 피하기 위해서는 문자열을 숫자로 변환하기 전에 해당 문자열이 유효한 숫자 형식인지 확인해야 합니다. 이를 위해 다음과 같은 방법을 사용할 수 있습니다:

1. **`try-catch` 구문 사용**: `try-catch` 구문을 사용하여 예외를 처리하고 변환할 수 없는 문자열에 대한 대체 값 또는 에러 메시지를 제공합니다.

   ```java
   String strNumber = "ABC";
   int number;
   try {
       number = Integer.parseInt(strNumber);
   } catch (NumberFormatException e) {
       // 변환할 수 없는 문자열에 대한 예외 처리
       number = 0; // 기본값 또는 대체 값 지정
   }
   ```

2. **정규 표현식을 사용하여 유효성 검사**: 문자열이 숫자 형식인지 정규 표현식을 사용하여 확인한 후에 변환합니다.

   ```java
   String strNumber = "123";
   if (strNumber.matches("\\d+")) {
       int number = Integer.parseInt(strNumber); // 숫자 형식이면 변환
   } else {
       // 숫자 형식이 아닌 경우에 대한 처리
   }
   ```

3. **`try-catch` 없이 `Integer.parseInt()` 사용 시 예외 처리**: `try-catch`를 사용하지 않고 `parseInt()` 메서드를 사용할 때는 `parseInt()` 메서드 이전에 문자열이 숫자 형식인지 검사해야 합니다.

   ```java
   String strNumber = "ABC";
   if (strNumber.matches("\\d+")) {
       int number = Integer.parseInt(strNumber); // 숫자 형식이면 변환
   } else {
       // 숫자 형식이 아닌 경우에 대한 처리
   }
   ```

주어진 문자열이 유효한 숫자 형식인지 확인하고 적절하게 예외 처리를 수행함으로써 `NumberFormatException`을 피할 수 있습니다. 이렇게 하면 프로그램의 안정성과 정확성을 높일 수 있습니다.