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

자바 StringIndexOutOfBoundsException(비검사 예외) 발생 원인과 처리 방법

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로 보호하면 훨씬 안정적인 자바 프로그램을 작성할 수 있습니다.