2014-10-30 5 views
-1

나는 긴 String하고 난 같은 문자열의 배열을 사용하여 분석 할 :최대 길이 []

String data = ... very long String delimited by spaces... 
String[] parse = data.split(" "); 

그러나 나는 다음과 같은 오류 얻을 : 그것은

java.lang.ArrayIndexOutOfBoundsException: 4617 

인가를 문자열 배열의 최대 길이는 4617입니까?

+0

아니요. 확실하지, 아마도'String.split()'의 정규식 예외일까요? 예외의 전체 스택 추적에 대해 더 많은 도움을 드릴 수 있습니다. 한 줄로는 우리에게별로 알려주지 않습니다. – markspace

+0

공백으로 구분 된 단어를 두 개 더 추가하고'parse.length()'?를 호출하면 어떨까요? – TheLostMind

+0

전체 스택 추적을 추가하십시오. – Jens

답변

3

Java에서 문자열 배열의 최대 길이는 Integer.MAX_VALUE - 5입니다. (이 초기화 내 64 비트 OS와 검사 :. String[] myStringArray = new String[Integer.MAX_VALUE-5]; Integer.MAX_VALUE-4 또는 더 큰 숫자 나에게 java.lang.OutOfMemoryError 오류가 있습니다이 기계와 OS에 의존하기 때문에 한계는, 당신을위한 다를 수 있습니다.). 당신이 넘어 가면

하더라도, 당신은 java.lang.OutOfMemoryError하지 java.lang.ArrayIndexOutOfBoundsException 볼 수 있습니다.

문제는 분명히 코드의 다른 부분과 관련이 있습니다.

+0

나중에 좋은 대답 내가 뭔가 op 코드로 잘못 생각합니다. 5' - –

+0

네 말이 맞아, 내가 :-(세상에 당신 – gaffcz

+0

@gaffcz 당신은 그것의'정수, MAX_VALUE가 지정되어 우리 PLZ –

0

아니요. 배열의 크기에는 최대 길이가 없습니다. OutOfMemoryError에 들어갈 수도 있습니다.

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(""); 
    for(int i=0;i<10000000000l;i++){ 
     sb.append(i).append(" "); 
    } 
    System.out.println(sb.toString().split("\\s").length); 
} 

일부 시스템에 OutOfMemoryError을 (가. 광산에서했던 JDK 6 그것을 시도)

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(""); 
    for(int i=0;i<10000;i++){ 
     sb.append(i).append(" "); 
    } 
    System.out.println(sb.toString().split("\\s").length); 
} 

위의 코드는 잘 작동하고 인쇄 1000

+1

배열의 크기는 'int'형식으로 배열의 크기를 지정하기 때문에 배열의 크기는'Integer.MAX_VALUE'를 초과 할 수 없습니다. 하지만 실제 한도는 더 낮을 수 있습니다. – nhahtdh

+0

@nhahtdh - 어디에서 언급 했습니까? – TheLostMind

+0

[JLS 8.0 - 섹션 15.10.1] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.10.1)'각 차원 표현식은 단항 숫자를 씁니다 프로모션 (§5.6.1). 승격 된 형식은 int 여야합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다. 배열의 길이는'int' 형식 만 될 수 있습니다. – nhahtdh

1

사용을 줄 수도 있습니다 위의 코드 파스

for(String s:parse){ 
System.out.println(s); 
} 
에 대한 parse..Somewhere을 반복하는 루프 enchance 코드에서 당신이 사용했던 다른 잘못된 인덱스