HOWTO · Java
Java.Lang.StringIndexOutOfBoundsException 수정: 범위를 벗어난 문자열 인덱스
빈 문자열에서 `charAt(0)`을 호출할 때 발생하는 `StringIndexOutOfBoundsException`의 원인과 문자열 길이에 따른 올바른 인덱스 범위, 안전한 검사 방법을 설명합니다.
이 페이지의 내용
빈 문자열에 charAt(0)을 호출하면 인덱스 0에 문자가 없으므로 Java에서 StringIndexOutOfBoundsException이 발생합니다. 문자를 읽기 전에 문자열의 길이를 확인하세요. 비어 있지 않은 문자열에서 유효한 문자 인덱스는 0부터 length() - 1까지입니다.
java.lang.StringIndexOutOfBoundsException: String index out of range 오류 해결
Java 문자열의 인덱스는 0부터 시작합니다. 길이가 n인 문자열의 문자 인덱스는 0부터 n - 1까지이며, length()와 같은 인덱스는 이미 범위를 벗어납니다. 따라서 빈 문자열에서는 charAt(0)을 호출할 수 없습니다. 가장 간단한 예시는 String value = ""; value.charAt(0);입니다. 문자열에 없는 문자를 요청하는 코드입니다. 이 코드는 원인을 설명하기 위한 것이며, 특정 예외 추적 정보나 실행 결과를 보여 주려는 것은 아닙니다.
다음 프로그램은 고정된 문자열에서 첫 문자를 올바르게 가져오는 방법을 보여 줍니다. 입력값과 문자 접근을 함께 두어 문자열 내용과 반환되는 문자의 관계를 알기 쉽게 했습니다. 실제 메서드에서는 문자열이 폼, 파일, 네트워크 응답 또는 다른 메서드에서 올 수도 있습니다. 어느 경우든 문자열에 해당 문자가 있는지 확인한 뒤에 인덱스를 사용해야 합니다. 이 예제를 실행해 보세요:
class StringIndexExample {
public static void main(String[] args) {
String value = "DelftStack";
System.out.println(value.charAt(0));
}
}
D
인덱스 0을 사용하기 전에는 문자열이 비어 있지 않은지 확인하세요. 아래의 보호된 예제는 첫 문자가 없으면 대체 안내 문구를 출력하고, 이 분기에서는 charAt(0)을 호출하지 않습니다. 다른 분기에서는 첫 문자를 읽습니다. 표시된 출력은 제공된 실행에서 나온 결과이며, 대체 안내 문구는 예시의 바이트 동일성을 유지하기 위해 영어로 남아 있습니다.
class SafeStringIndexExample {
public static void main(String[] args) {
String value = "";
if (!value.isEmpty()) {
System.out.println(value.charAt(0));
} else {
System.out.println("No character at index 0");
}
}
}
No character at index 0
인덱스가 사용자 입력에서 온다면 사용하기 전에 유효성을 검사하세요. 길이가 n인 문자열에서 문자 인덱스로 허용되는 값은 0 <= index && index < n을 만족해야 합니다. 인덱스를 텍스트에서 읽었다면 먼저 숫자로 변환하고, 숫자가 아닌 입력을 애플리케이션에서 어떻게 처리할지도 정하세요. 그런 다음 실제로 읽을 문자열을 기준으로 범위를 검사하세요. 한 문자열을 검사한 뒤 다른 문자열을 읽거나, 검사 후 문자열이 변경되면 검사가 더 이상 유효하지 않을 수 있습니다. 호출자가 기본 문자를 필요로 한다면, 문서에 명시한 자리 표시자처럼 애플리케이션에서 의미가 정해진 값을 선택하세요. 적절한 기본값이 없다면 데이터를 조용히 바꾸는 대신 상태를 반환하거나, 입력을 다시 요청하거나, 작업을 건너뛰세요.
다른 문자열 연산에도 관련은 있지만 서로 다른 경계 조건이 적용됩니다. substring(beginIndex)에서는 0 <= beginIndex <= length()가 성립해야 합니다. substring(beginIndex, endIndex)와 subSequence(beginIndex, endIndex)에서는 0 <= beginIndex <= endIndex <= length()를 만족해야 합니다. 끝 인덱스는 범위에 포함되지 않으므로 문자열 길이와 같아도 됩니다. String.valueOf(charArray, offset, count)에서는 offset과 count가 음수가 아니어야 하며, 요청한 범위가 배열 안에 들어와야 합니다. 이러한 경계 조건을 만족하지 않으면 메서드가 StringIndexOutOfBoundsException을 던질 수 있습니다. 모든 문자열 메서드가 같은 경계 조건을 사용한다고 가정하지 말고, 각 연산의 인수를 확인하세요.
StringIndexOutOfBoundsException은 확인되지 않는 예외이므로 메서드에서 선언할 필요가 없습니다. 앞에서 유효성을 확인할 수 없는 경계에서 예상치 못한 잘못된 인덱스가 들어오거나 해당 계층에서 복구해야 한다면 try-catch를 사용할 수 있습니다. 하지만 예외 처리가 일반적인 입력 및 범위 검사를 대신해서는 안 됩니다. 접근 후 오류를 잡더라도 요청한 문자가 생기는 것은 아닙니다. 인덱스 0 오류를 디버깅할 때는 문자열이 만들어지는 위치, 자르기나 파싱 과정에서 문자열이 바뀌었는지, 어떤 분기에서 문자에 접근하는지 살펴보세요. 예외 메시지와 스택 추적은 Java 버전에 따라 달라질 수 있으므로, 정확한 문구에 의존하지 말고 실제 인덱스를 현재 문자열의 length()와 비교하세요.