StringIndexOutOfBoundsException은 자바에서 대표적인 비검사 예외(unchecked exception) 중 하나입니다. 문자열(String)은 여러 개의 문자(character)가 모여 이루어진 집합으로, String 객체가 허용하는 유효 인덱스 범위는 [0, 문자열 길이]입니다. 따라서 실제 문자열의 범위를 초과하는 인덱스로 문자에 접근하려고 하면 이 예외가 발생합니다.
StringIndexOutOfBoundsException이란?
이 예외는 java.lang 패키지에 속하며, IndexOutOfBoundsException을 상속하고 다시 RuntimeException을 상속하기 때문에 컴파일러가 강제로 처리 여부를 검사하지 않는 비검사 예외로 분류됩니다. 주로 charAt(), substring(), charAt(int index) 같은 메서드를 호출할 때 잘못된 인덱스를 전달하면 발생합니다.
예제 1: 예외가 발생하는 상황
public class StringDemo {
public static void main(String[] args) {
String str = "Welcome to Tutorials Point.";
System.out.println("문자열의 길이: " + str.length());
System.out.println("부분 문자열: " + str.substring(28));
}
}실행 결과
문자열의 길이: 27 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1931) at StringDemo.main(StringDemo.java:6)
위 예제에서 문자열의 실제 길이는 27입니다. 그런데 substring(28)처럼 길이보다 큰 인덱스를 요청했기 때문에 프로그램은 정상적으로 실행되지 않고 StringIndexOutOfBoundsException이 발생하며 종료됩니다.
StringIndexOutOfBoundsException 처리 방법
- String.length() 메서드로 범위 확인: 문자열에 접근하기 전에
length()메서드로 문자열의 길이를 먼저 확인하고, 유효한 범위 내의 인덱스만 사용하도록 코드를 작성할 수 있습니다. - try-catch 블록 사용: StringIndexOutOfBoundsException이 발생할 가능성이 있는 코드 부분을
try-catch블록으로 감싸서, 예외가 발생하더라도 프로그램이 비정상 종료되지 않도록 안전하게 처리할 수 있습니다.
예제 2: try-catch 블록으로 예외 처리하기
public class StringIndexOutOfBoundsExceptionTest {
public static void main(String[] args) {
String str = "Welcome to Tutorials Point.";
try {
// str의 길이가 27이므로 charAt(28)은 예외를 발생시킵니다.
str.charAt(28);
System.out.println("유효한 문자열 인덱스입니다");
} catch (StringIndexOutOfBoundsException e) {
System.out.println("문자열 인덱스가 범위를 벗어났습니다");
}
}
}실행 결과
문자열 인덱스가 범위를 벗어났습니다
이번에는 charAt(28) 호출 시 예외가 발생하지만, catch 블록이 이를 잡아내기 때문에 프로그램이 강제로 종료되지 않고 지정한 메시지를 출력한 뒤 정상적으로 실행을 마칩니다.
마무리
StringIndexOutOfBoundsException은 컴파일 시점이 아닌 런타임에 발생하는 비검사 예외이므로, 개발자가 사전에 인덱스 범위를 꼼꼼히 검증하는 습관이 중요합니다. 문자열 조작 전 length()로 길이를 확인하거나, 예외 가능성이 있는 코드를 try-catch로 보호하면 훨씬 안정적인 자바 프로그램을 작성할 수 있습니다.