2014-10-30 5 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

+0

Почему бы вам не добавить еще пару слов, разделенных пробелами, и вызвать 'parse.length()' ?. – TheLostMind

+0

Пожалуйста, добавьте весь стек. – Jens

ответ

3

Максимальная длина массива строк в Java равна Integer.MAX_VALUE - 5. (Проверено с моей 64-битной ОС с этой инициализацией: String[] myStringArray = new String[Integer.MAX_VALUE-5];. Integer.MAX_VALUE-4 или больше цифр дает мне ошибку java.lang.OutOfMemoryError. Предел может быть другим для вас, так как он зависит от машины и ОС).

Даже если вы выйдете за пределы этого, вы увидите java.lang.OutOfMemoryError, а не java.lang.ArrayIndexOutOfBoundsException.

Проблема, безусловно, связана с другой частью вашего кода.

+0

ya nice answer Я чувствую, что что-то не так с op-кодом. –

+0

Вы правы, я нашел тривиальную ошибку в моем коде, omg :-(спасибо – gaffcz

+0

@gaffcz вы можете поделиться своей ошибкой с нами 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

Размер массива не может превышать 'Integer.MAX_VALUE', так как язык задает размер массива как' int'. Однако фактический предел может быть ниже. – nhahtdh

+0

@nhahtdh - Где они упомянули? – TheLostMind

+0

[JLS 8.0 - Section 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

использования enchance for loop для итерации по синтаксическому анализу. В другом месте кода вы использовали неверный индекс для анализа

for(String s:parse){ 
System.out.println(s); 
} 
Смежные вопросы