티스토리 뷰


자바에서 NumberFormatException 원인과 에러/예외 해결 방법을 알아보자. java.lang 패키지에 속하는 놈이다.

 

Java NumberFormatException

 

 

1. NumberFormatException 원인은?

일단 이름에서도 유추할 수 있듯이 숫자가 아닌 녀석을 숫자 형으로 변환하려고 할 때 일어난다. 

 

아마 가장 많이 만나는 유형은 Integer.parseInt(String s) 를 사용하면서다. 문자열을 int 형으로 변환할 때 사용하게 되는데 의도치 않게 숫자 외에 형태가 들어가있을 때 우리는 이놈을 만나게 된다.

 

최대한 간단한 샘픔을 보면서 이해해보자. 

package practice;

public class test_NumberFormatException {
    public static void main(String[] args) {
        String a = "123";   // 숫자 타입의 정상적인 문자열은
        System.out.println(Integer.parseInt(a)); // 잘 바뀌지만...
        String b = "123a"; // 숫자가 아닌 녀석을
        System.out.println(Integer.parseInt(b)); // 숫자로 바꾸려고 하면 일어난다.
    }
}

123
Exception in thread "main" java.lang.NumberFormatException: For input string: "123a"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.base/java.lang.Integer.parseInt(Integer.java:652)
	at java.base/java.lang.Integer.parseInt(Integer.java:770)
	at practice.test_NumberFormatException.main(test_NumberFormatException.java:8)

물론 숫자로만 이루어져있다고 해도 범위를 벗어나도 동일하게 변환이 되지 않는다. 

String b = "12312312312"; // int보다 범위가 큰 녀석을
System.out.println(Integer.parseInt(b)); // 숫자로 바꾸려고 하면 일어난다.

 

당연히 null이거나 바꾸려는 대상의 길이가 0인 경우에도 발생하고 정수가 아닌 경우에도 발생한다.

 


2. NumberFormatException를 던지는 놈?

NumberFormatException를 던지는 놈은 매우 많지만 기본적으로는 Integer 클래스의 메소드들이 기본이다. 

 

Integer.parseInt가 만나게 되는 대부분이지만

public static int parseInt(String s) throws NumberFormatException
public static Byte valueOf(String s) throws NumberFormatException
public static byte parseByte(String s) throws NumberFormatException
public static byte parseByte(String s, int radix) throws NumberFormatException
public Integer(String s) throws NumberFormatException
public Byte(String s) throws NumberFormatException

이녀석들이 발생하게 되는 거의 근본적인 애들이고 나머지 사용자 라이브러리 jar 파일이나 프레임웤은 여기서 발생되는 애들을 한번 더 예외 처리하는 수준이 대부분일거라 생각한다. 


3. NumberFormatException 해결 방법은?

 

당연한 얘기지만 일단 숫자 타입이 아닌 문자열 데이터가 들어오게 된 배경을 확실히 이해하고 ... 배경을 해결하던가 발생했을 때 기본값을 주는 형태로 해결하는 경우가 많은 것 같다. 

 

package test;

public class test {
	public static void main(String[] args) {
        String a = "123";   // 숫자 타입의 정상적인 문자열은
        System.out.println(Integer.parseInt(a)); // 잘 바뀌지만...
        int c = 0;
        try {
        	String b = "123a"; // 숫자가 아닌 녀석을
        	c = Integer.parseInt(b);            
        }catch(NumberFormatException e) {
        	c = 100; // 기본값 세팅
        }
    }
}

 

int c의 기본값을 100으로 주면서 해결하는 방식이다. 워낙 많이 만나는 놈이라... 반갑...


댓글
최근에 올라온 글
최근에 달린 댓글