자바에서 NumberFormatException 원인과 에러/예외 해결 방법을 알아보자. java.lang 패키지에 속하는 놈이다.
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으로 주면서 해결하는 방식이다. 워낙 많이 만나는 놈이라... 반갑...
'dev > java' 카테고리의 다른 글
자바 AOP - JDK Dynamic Proxy 사용해보기 - Java AOP #2 (0) | 2021.02.15 |
---|---|
java.net.MalformedURLException 원인 및 에러 해결 방법 (0) | 2020.11.03 |
자바 개발자를 위한 이클립스 단축키 top 30 (4) | 2020.10.26 |
IllegalAccessError 원인과 예외/에러 해결 방법(java.lang.IllegalAccessError) (0) | 2020.01.12 |
RuntimeException란 무엇인가? (1) | 2020.01.10 |
java.lang.IllegalAccessException 에러 해결 방법 (0) | 2019.12.23 |
java.lang.IndexOutOfBoundsException Index: 0, Size: 0 에러 해결 방법( ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException) (0) | 2019.12.14 |
CloneNotSupportedException 에러 해결 방법(java.lang.CloneNotSupportedException) (0) | 2019.12.10 |