java.lang.NumberFormatException은 문자열을 수로 변환할 때 발생하는 에러입니다.
NumberFormatException (Java Platform SE 8 )
docs.oracle.com
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(bf.readLine());
int b = Integer.parseInt(bf.readLine());
System.out.println(a+b);
}
}
소스 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를 이용해 올바르게 구현한다면 다음과 같습니다.
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] strs = bf.readLine().split(" ");
int a = Integer.parseInt(strs[0]);
int b = Integer.parseInt(strs[1]);
System.out.println(a+b);
}
}
소스 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);과 같은 의미를 갖고, null은 Integer로 변환할 수 없기 때문에, 런타임 에러가 발생합니다. 런타임 에러 메시지는 다음과 같습니다.
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)
'BE > JAVA' 카테고리의 다른 글
[Java] StringTokenizer 기본 및 사용법 (0) | 2022.04.28 |
---|---|
[JAVA/자바] while문, do~while문 (0) | 2022.04.28 |
[JAVA] BufferedReader 와 Bufferedwriter 사용법 (0) | 2022.04.28 |
자바 JDK, JRE, JVM의 차이 (0) | 2022.04.20 |
현재 문제가 되고 있는 Log4j 2 관련하여 해결 방안 (0) | 2021.12.13 |