NumberFormat

java.lang.NumberFormatException은 문자열을 수로 변환할 때 발생하는 에러입니다.

소스 1. 두 수를 입력받고, 합을 출력하는 소스

소스 1이 올바르게 동작하려면, 첫째 줄과 둘째 줄에 수가 각각 하나씩 있어야 합니다. 따라서, 입력이 다음과 같은 경우에는 올바르게 3을 출력하게 됩니다.

1
2

하지만, 입력이 다음과 같은 경우에는 java.lang.NumberFormatException이 발생합니다.

1 2

이때 발생하는 런타임 에러 메시지는 다음과 같습니다.

Exception in thread "main" java.lang.NumberFormatException: For input string: "1 2"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at Main.main(Main.java:6)

문자열 "1 2"는 정수 하나로 변환할 수 없기 때문에, 에러가 발생하는 것입니다. 이런 경우에는 소스가 문제의 입력 형식을 잘 지키고 있는지 확인해봐야 합니다. 입력이 한 줄에 공백으로 구분되어서 들어오는 경우, BufferedReader를 이용해 올바르게 구현한다면 다음과 같습니다.

소스 2. 두 수를 입력받고, 합을 출력하는 소스

java.lang.NumberFormatException는 수가 자료형의 범위를 벗어나 해당 자료형으로 벗어날 수 없을 때도 발생합니다.

소스 1에 다음과 같은 입력을 넣으면 런타임 에러가 발생하고, 그때 메시지는 다음과 같습니다.

123456789123
234567891234
Exception in thread "main" java.lang.NumberFormatException: For input string: "123456789123"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:583)
	at java.lang.Integer.parseInt(Integer.java:615)
	at Main.main(Main.java:6)

소스 1은 Integer.parseInt를 사용하고 있기 때문에, 결과가 Integer의 범위 안에 들어있어야 합니다. 123456789123는 231-1보다 커서 Integer의 범위를 벗어나기 때문에, java.lang.NumberFormatException이 발생합니다.

이런 경우에는 문제의 입력 조건에 해당하는 자료형을 사용하고 있는지 살펴봐야 합니다.

문자열에 숫자가 아닌 문자가 들어있는 경우에도 이 에러가 발생합니다. 소스 1의 입력이 다음과 같다면 런타임 에러가 발생합니다.

1a2
233
Exception in thread "main" java.lang.NumberFormatException: For input string: "1a2"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at Main.main(Main.java:6)

가장 처음에 설명한 "1 2"의 예시가 여기에 해당된다고 볼 수 있습니다. 이유는 공백 한 칸이 숫자가 아닌 문자이기 때문입니다.

입력받을 것이 없는데, 입력을 받는 경우에도 이 에러가 발생합니다. 소스 1에 다음과 같이 정수 하나만 입력으로 들어온다면, 7번 줄의 bf.readLine()null을 리턴합니다.

123

따라서, 7번 줄은 int b = Integer.parseInt(null);과 같은 의미를 갖고, nullInteger로 변환할 수 없기 때문에, 런타임 에러가 발생합니다. 런타임 에러 메시지는 다음과 같습니다.

Exception in thread "main" java.lang.NumberFormatException: null
	at java.lang.Integer.parseInt(Integer.java:542)
	at java.lang.Integer.parseInt(Integer.java:615)
	at Main.main(Main.java:7)