2017-02-11 5 views
0

ИСПРАВЛЕНО:Как исправить ошибку индекса?

я снял время цикла и добавил

if (num.contains(count) == true) { 
       freq = Collections.frequency(num, count); 

       for (int k = 0; k < freq; k++) { 
        sb.append(temp); 
       } 
      } 

Я пытаюсь добавить случайный (а между 0-8) дополнительные копии писем к слову. Пример ... может превратиться в dddooees или doeess.

Моя функция работает иногда, но всегда вылетает с ошибкой индекса Out of Bounds.

Я предполагаю, что в какой-то момент мне нужно проверить значение NULL my ArrayList. Я попробовал обернуть свою инструкцию while и, если ее проверить, но никаких улучшений не было. Какие-либо предложения?

private static String addLetters(String word) { 
     StringBuilder sb = new StringBuilder(word.length()); 
     String[] apart = word.split(""); 
     int rand = (int)(Math.random() * 8); 
     int ran, goUp; 
     int count = 0; 

     List<Integer> num = new ArrayList<>(); 

     for (int i = 0; i < rand; i++) { 
      ran = (int)(Math.random() * word.length()); 
      num.add(ran); 
     } 

     Collections.sort(num); 

     for (int temp : num) { 
      System.out.println(temp); 
     } 

     for (String temp: apart) { 
      goUp = count; 

      sb.append(temp); 
      System.out.printf("String so far: %s\n", sb.toString()); 
      System.out.printf("OUTSIDE: count: %d, goUp: %d\n", count, goUp); 

     /* 
     Removed the while loop and added in the above code using collections, works as intended now. 
     */ 
      while (count == num.get(goUp)) { 
       System.out.printf("INSIDE: count: %d, goUp: %d\n", count, num.get(goUp)); 
       sb.append(temp); 
       System.out.printf("String ADD extra: %s\n", sb.toString()); 
       goUp++; 
      } 
      count++; 
     } 
     return sb.toString(); 
    } 

ответ

1

Ваш цикл на входе слово (размер) и вы делаете num.get(goUp) на NUM (рант часть), если размер входного слова более большие, чем размер ранда у вас есть эта ошибка (строка 41):

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 
    at java.util.ArrayList.rangeCheck(ArrayList.java:638) 
    at java.util.ArrayList.get(ArrayList.java:414) 
    at com.sgr.games.Stack.addLetters(Stack.java:41) 
    at com.sgr.games.Stack.main(Stack.java:10) 

L39 System.out.printf("OUTSIDE: count: %d, goUp: %d\n", count, goUp); 
L40 
L41 while (count == num.get(goUp)) { 
L42  System.out.printf("INSIDE: count: %d, goUp: %d\n", count, num.get(goUp)); 
+0

Да, я вижу, исправил это. – Yawn

0

Ошибки в массиве из-за границ, как правило, обрабатываются путем исправления ошибки.

Ваша логика достаточно запутанна, что я не уверен точно, как ваш код должен работать. Тем не менее, я вижу ваш сбой:

Сравните назначение массива num, как показано, как вы его заполняете, с тем чтобы он использовался в условном выражении while. Вы, очевидно, используете его в двух разных моделях.

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