NumberFormatException 에러 (replaceAll()메서드 처리)
public class programmers120851 {
public static void main(String[] args) {
String my_string ="aAb1B2cC34oOp";
my_string.replaceAll("[^0-9]", "");
int sum = 0;
for (int i = 0; i < my_string.length(); i++) {
String letter = String.valueOf(my_string.charAt(i));
sum += Integer.parseInt(letter);
}
System.out.println("sum = " + sum);
}
}
프로그래머스의 숨어있는 숫자의 덧셈(1) 문제이다. 이렇게 코드를 작성했을 시 빨간줄이 그어지는 곳이 없었기 때문에 컴파일을 하였는데 아래와 같은 에러가 났다.
에러 내용
Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:668)
at java.base/java.lang.Integer.parseInt(Integer.java:786)
이 에러는 자바에서 숫자로 변환할 수 없는 문자열을 숫자로 변환하려고 할 때 발생하는 예외이다.
분명 replaceAll을 통해서 문자들을 없애고 숫자만 String안에 남아있을텐데 왜 이런 에러가 날까??
해결
my_string.replaceAll("[^0-9]", "");
문제는 이 부분이었다. 이렇게 작성한다고 하여도 my_string의 값이 변하는 것이 아니다.
즉 my_string의 값은 변하지 않았기 때문에 그대로 "aAb1B2cC34oOp"의 값을 가지고 있어서 이를 Integer.parseInt(letter); 을 이용해 숫자로 변환하려고 할 때 에러가 나는 것이다. (이 메서드는 숫자로만 이루어진 String값을 int형으로 바꿀 수 있다.)
그러므로 아래와 같이 replaceAll()메서드를 이용하여 숫자만 남겨진 String을 다시 자기 자신에게 넣어줘야한다.
my_string = my_string.replaceAll("[^0-9]","");
결과: sum = 10
문제의 원인은 다른 곳에 있었다. 앞의 단계가 누락되어서(문자열 변환부분) 뒷부분에서(문자열->int형) 에러가 발생하였다.