Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java의 StringIndexOutOfBoundsException이란? 원인과 해결 방법

Java에서 문자열(String)은 일련의 문자들을 저장하는 데 사용되며, 객체로 취급됩니다. java.lang 패키지의 String 클래스가 문자열을 대표하며, new 키워드를 사용해 다른 객체처럼 생성하거나, 기본 자료형처럼 리터럴에 값을 할당하는 방식으로 만들 수 있습니다.

String stringObject = new String("Hello how are you");
String stringLiteral = "Welcome to Tutorialspoint";

문자열은 내부적으로 문자 배열을 저장하기 때문에, 배열과 마찬가지로 각 문자의 위치가 인덱스(0부터 시작)로 표현됩니다. 예를 들어 다음과 같이 문자열을 생성했다면,

String str = "Hello";

각 문자는 아래와 같이 인덱스에 배치됩니다.

  • 인덱스 0 → 'H'
  • 인덱스 1 → 'e'
  • 인덱스 2 → 'l'
  • 인덱스 3 → 'l'
  • 인덱스 4 → 'o'

StringIndexOutOfBoundsException 발생 원인

문자열의 길이보다 큰 인덱스에 있는 문자에 접근하려고 하면 StringIndexOutOfBoundsException이 발생합니다. 이는 유효 범위(0 ~ length-1)를 벗어난 인덱스에 접근했음을 의미하는 런타임 예외입니다.

예제 코드

Java의 String 클래스는 문자열을 조작할 수 있는 다양한 메서드를 제공합니다. 그중 charAt() 메서드를 사용하면 특정 인덱스에 위치한 문자를 조회할 수 있습니다. 이 메서드는 인덱스를 나타내는 정수 값을 매개변수로 받아, 해당 위치의 문자를 반환합니다.

다음 예제에서는 길이가 17인 문자열을 생성한 뒤, 인덱스 40에 있는 문자를 출력하려고 시도합니다.

public class Test {
    public static void main(String[] args) {
        String str = "Hello how are you";
        System.out.println("Length of the String: "+str.length());
        for(int i=0; i<str.length(); i++) {
            System.out.println(str.charAt(i));
        }
        // 문자열 길이보다 큰 인덱스의 요소에 접근
        System.out.println(str.charAt(40));
    }
}

실행 결과

런타임 예외 발생 −

문자열 길이(17)보다 큰 인덱스 40의 요소에 접근했기 때문에 StringIndexOutOfBoundsException이 발생합니다.

Length of the String: 17
H
e
l
l
o
 
h
o
w
 
a
r
e
 
y
o
u
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 40
    at java.base/java.lang.StringLatin1.charAt(Unknown Source)
    at java.base/java.lang.String.charAt(Unknown Source)
    at Test.main(Test.java:9)

예외를 방지하는 방법

이러한 예외를 피하려면 charAt(), substring() 등의 메서드를 호출하기 전에 반드시 인덱스가 0 이상, 문자열 길이 미만인지 확인해야 합니다. 예를 들어 다음과 같이 조건 검사를 추가하면 안전하게 처리할 수 있습니다.

int index = 40;
if(index >= 0 && index < str.length()) {
    System.out.println(str.charAt(index));
} else {
    System.out.println("유효하지 않은 인덱스입니다.");
}

또한 루프를 돌며 문자에 접근할 때는 종료 조건을 i < str.length()로 설정하는 습관을 들이면, 범위를 벗어나는 접근을 사전에 차단할 수 있습니다.