본문 바로가기
웹 개발/error

NumberFormatException 에러 (replaceAll()메서드 처리)

by dani0312 2023. 5. 31.

 

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형) 에러가 발생하였다. 


/* 내가 추가한 코드 */ /* 내가 추가한 코드 끝끝 */