2014-01-06 3 views
0

Я получил следующий Java-код:Java: ArrayIndexOutOfBounds

public void varsInvullen(String tempTekst){ 
     int i,aantalVraagtekens = 0; 
     String ingevuldeParameter; 

     for(i= 0; tempTekst.length() > i; i++){ 
      if(tempTekst.charAt(i) == '?'){ 
       aantalVraagtekens++; 
       System.out.println(aantalVraagtekens); 
       } 
      } 

     String[] variables1 = new String[aantalVraagtekens+1]; 
     String[] tempTekst2 = tempTekst.split("\\s+"); 

     for(i = 0; tempTekst2.length > i; i++){ 
      if(tempTekst2[i].charAt(0) == '?'){ 

       variables1[i] = tempTekst2[i]; 
       if(!variables1[i].equals("null")){ 
        System.out.println("Invoer voor parameter: "+variables1[i]+" >>>"); 
        ingevuldeParameter = Input.readString(); 

        tempTekst = tempTekst.replace(variables1[i],ingevuldeParameter); 
        i++; 
       } 
      } 
     } 

     System.out.println("De volledig ingevulde template:"); 
     System.out.println(tempTekst); 
    } 

Ошибки я получаю это:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
     at Mailmatcher.varsInvullen(Mailmatcher.java:68) 
     at Mailmatcher.personaliseren(Mailmatcher.java:90) 
     at Mailmatcher.menu(Mailmatcher.java:29) 
     at Mailmatcher.main(Mailmatcher.java:131) 

Я знаю, что эта ошибка означает, что мой массив слишком мал, но это не так, потому что, если я играю с System.out.println(variables1.length); в разных местах, он всегда показывает, что массив должен быть правильного размера.

Не знаю, ясно ли, что я имею в виду, если вам нужна дополнительная информация, просто просить.

Спасибо!

+0

И какая линия точно соответствует линии 68? Я чувствую, что это может иметь какое-то отношение к 'i ++;' внутри цикла for. Должно ли это действительно быть там? – Sinkingpoint

+0

variables1 [i] = tempTekst2 [i]; – user3165926

ответ

1

variables1 имеет длину, равную количеству вопросительных знаков в tempTekst + 1. tempTekst2 массив сделан из разделив tempTekst по одному или нескольким символам пробела. Затем вы будете использовать длину tempTekst2, которая может быть больше variables1, если tempTekst имеет больше слов с пробелами, чем вопросительные знаки.

Например, если входная строка "Do we ? count ? only ? blue ? cars ?" то длина variables1 будет 6. tempTekst2 будет {"Do", "we", "?", "count", "?", "only", "?", "blue", "?", "cars", "?"} Когда цикл с использованием длиной tempTekst2 вы займетесь циклом 11 раз. Поэтому, когда вы нажмете на 1-й вопрос, отметьте i. 2. Когда вы нажмете на последний вопрос, отметьте i. 10. Когда вы попытаетесь установить variables1[10] = независимо от текста вводится исключение, потому что размер variables1 составляет всего 6.

+0

вот что я чтобы сделать с кодом, я не думаю, что я получаю вас, не могли бы вы быть более конкретным, пожалуйста? – user3165926

+0

Ваш код будет работать только в том случае, если количество слов, возникающих в результате расщепления 'tempTekst', меньше или равно числу вопросительных знаков, содержащихся в строке + 1. –

+0

oooh, теперь я вижу, что в основном это означает, что мой код будет никогда не работайте так: p Я посмотрю на это и вернусь к вам, ребята, если я найду решение – user3165926

-2

Вы хотите, чтобы длина() - 1 в ваших циклах. Java списки/массивы равны нулю индексируется так, а длина может быть X последний элемент в X-1

+0

Пробовал это, дает мне ту же ошибку – user3165926

+0

Проверьте, что вторая для цикла тоже. что среднее состояние выглядит немного неуклюжим. Кроме того, при установке stacktraces и фрагментов кода полезно указать, какая строка в трассе соответствует той строке в фрагменте, чтобы мы знали, где искать. – evanchooly

+0

попробовал длину-1 на обоих, но все же, тот же результат, я отредактирую сообщение – user3165926

Смежные вопросы