2014-10-30 149 views
-1

我有很長的String,我想用字符串數組這樣分析它:字符串的最大長度[]

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

,但我得到了以下錯誤:

java.lang.ArrayIndexOutOfBoundsException: 4617 

是它可能,String數組的最大長度是4617?

+0

不,它不是。不確定,可能是'String.split()'中的正則表達式的異常?我們可以通過該例外的完整堆棧跟蹤來幫助您。一條線沒有告訴我們很多。 – markspace 2014-10-30 06:51:43

+0

爲什麼不添加多個由空格分隔的單詞並調用'parse.length()'?. – TheLostMind 2014-10-30 06:52:52

+0

請添加整個堆棧跟蹤。 – Jens 2014-10-30 06:53:11

回答

3

Java中字符串數組的最大長度爲Integer.MAX_VALUE - 5。 (用我的64位操作系統進行初始化檢查:String[] myStringArray = new String[Integer.MAX_VALUE-5];Integer.MAX_VALUE-4或更大的數字會給我0123'錯誤。由於機器和操作系統的不同,這個限制可能會有所不同)。

即使您超出這個範圍,您將看到java.lang.OutOfMemoryError,而不是java.lang.ArrayIndexOutOfBoundsException

問題是肯定與您的代碼的其他部分。

+0

雅佳答案我覺得操作代碼有問題。 – 2014-10-30 06:58:27

+0

你是對的,我在我的代碼中發現了一個微不足道的錯誤,omg :-(謝謝 – gaffcz 2014-10-30 06:59:21

+0

@gaffcz你可以與我們分享你的錯誤嗎? – 2014-10-30 06:59:51

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

數組的大小不能超過'Integer.MAX_VALUE',因爲該語言將數組大小指定爲'int'類型。但實際的限制可能會更低。 – nhahtdh 2014-10-30 08:04:47

+0

@nhahtdh - 他們在哪裏提到它? – TheLostMind 2014-10-30 08:34:22

+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 2014-10-30 08:44:51

1

使用循環迭代解析..在你的代碼中的其他地方你已經使用錯誤的索引進行解析

for(String s:parse){ 
System.out.println(s); 
}