2015-02-05 4 views
0

Я не могу понять, что не так, или почему он дает мне вывод, который он делает, я скопирую &. Вставьте мой код для двух классов и вывод на консоль, который я получаю, и, возможно, кто-то лучше меня на Java может помочь понять это, я уверен, что это что-то тривиальным:
первый классArrayIndexOutOfBounds Exception Java

public class PoolTest { 
    public static void main(String args[]){ 
     Pool newPool = new Pool(); 
     System.out.println(newPool.getValue('q')); 
     System.out.println(newPool.getTiles(10)); 
     newPool.poolReset(); 
     System.out.println(newPool.getTiles(11)); 
     /* We have 100 tiles in the pool */ 
     System.out.println(newPool.getTilesRemaining()); //100 
     System.out.println(newPool.isEmpty()); //false 
     newPool.getTiles(5); //ok 
     System.out.println(newPool.getTilesRemaining()); //95 
    } 
} 

второй класс

import java.util.Random; 

public class Pool { 
char[] zeroPoint = {'*','*'}; 
char[] onePoint = {'a','a','a','a','a','a','a','a','a','e','e','e','e','e','e','e','e','e','e','e','e','i','i','i','i','i','i','i','i','i','o','o','o','o','o','o','o','o','n','n','n','n','n','n','r','r','r','r','r','r','t','t','t','t','t','t','l','l','l','l','s','s','s','s','u','u','u','u'}; 
char[] twoPoint = {'d','d','d','d', 'g', 'g', 'g', 'g',}; 
char[] threePoint = {'b', 'b', 'c', 'c', 'm', 'm', 'p', 'p'}; 
char[] fourPoint = {'f', 'f', 'h', 'h', 'v', 'v', 'w', 'w', 'y', 'y'}; 
char[] fivePoint = {'k'}; 
char[] eightPoint = {'j', 'x'}; 
char[] tenPoint = {'q', 'z'}; 
char[] charPool = new char[102]; 
String stringPool = new String(onePoint)+ new String(twoPoint)+ new String(threePoint)+ new String(fourPoint)+ new String(fivePoint)+ new String(eightPoint)+ new String(tenPoint); 
public Pool(){ 
    charPool = stringPool.toCharArray(); 
} 

public int getValue(char letter){ 
    int value=0; 
    if(new String(zeroPoint).indexOf(letter)>-1){ 
     value=0; 
    } else if(new String(onePoint).indexOf(letter)>-1){ 
     value=1; 
    } else if(new String(twoPoint).indexOf(letter)>-1){ 
     value=2; 
    } else if(new String(threePoint).indexOf(letter)>-1){ 
     value=3; 
    } else if(new String(fourPoint).indexOf(letter)>-1){ 
     value=4; 
    } else if(new String(fivePoint).indexOf(letter)>-1){ 
     value=5; 
    } else if(new String(eightPoint).indexOf(letter)>-1){ 
     value=8; 
    } else if(new String(tenPoint).indexOf(letter)>-1){ 
     value=10; 
    } 

    return value; 
} 

public void poolReset(){ 
    charPool = stringPool.toCharArray(); 
} 

public char[] getTiles(int numberOfTiles){ 
    Random randomTile = new Random(); 
    int randomNum; 
    int returned; 
    char[] tilesReturned = new char[numberOfTiles]; 

    for(int i=0; i<numberOfTiles; i++){ 
     returned=0; 
     do{ 
      randomNum=randomTile.nextInt(102); 
      if(charPool[randomNum]!='0') { 
       tilesReturned[i]=charPool[randomNum]; 
       charPool[randomNum]='0'; 
       returned = 1; 
      } 
     }while(returned==0); 
    } 
    return tilesReturned; 
} 
public char[] swapTiles(char[] tilesToSwap){ 
    Random randomTile = new Random(); 
    int randomNum; 
    int returned; 
    int numberOfTiles = tilesToSwap.length; 
    char[] tilesReturned = new char[numberOfTiles]; 

    for(int i=0; i<numberOfTiles; i++){ 
     returned=0; 
     while(returned==0){ 
      randomNum=randomTile.nextInt(102); 
      if(charPool[randomNum]!='0') { 
       tilesReturned[i]=charPool[randomNum]; 
       charPool[randomNum]=tilesToSwap[randomNum]; 
       returned = 1; 
      } 
     } 
    } 
    return tilesReturned; 
} 

public boolean isEmpty(){ 
    boolean empty=true; 
    for(int i=0; i<102; i++){ 
     if(charPool[i]!='0'){ 
      empty=false; 
     } 
    } 
    return empty; 
} 

public int getTilesRemaining(){ 
    int tilesRemaining=0; 
    for(int i=0; i<102; i++){ 
     if(charPool[i]=='0'){ 
      tilesRemaining++; 
     } 
    } 
    return tilesRemaining; 
} 

} 

выход консоли

10 
stsfrebias 
goresthltii 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 99 
    at Pool.getTilesRemaining(Pool.java:98) 
    at PoolTest.main(PoolTest.java:10) 
+4

Отладчик - ваш друг! – Christian

+2

В Java массивы имеют свойство length, это не так. – meskobalazs

+0

Кажется, что вы просто в каком-то цикле «для» имеют ошибку с диапазоном индексов. Не ленитесь - используйте отладчик и проверьте его. :) – sphinks

ответ

2

Эта строка кода изменили значение charPool, делает его короче, чем 102.

String stringPool = new String(onePoint)+ new String(twoPoint)+ new String(threePoint)+ new String(fourPoint)+ new String(fivePoint)+ new String(eightPoint)+ new String(tenPoint) 

И тогда у вас есть эта строка:

charPool = stringPool.toCharArray(); 

Я считаю, длина stringPool составляет 99 символов, а не 102. Поэтому, когда вы повторяете свой charPool с циклом цикла следующим образом:

for(int i=0; i<102; i++){ 

Это будет «o utofindex». Вы можете захотеть изменить вышеупомянутую петлю на:

for(int i=0; i<charPool.length; i++){ 
+0

101 персонаж, но все остальное в порядке. –

+0

Я думаю, что 99 символов, так как он не добавил zeroPoint в stringPool. –

+0

Спасибо! Я думаю, что самая большая ошибка этого заключалась в том, что вместо charPool.length я использовал прямой 102; это просто плохая практика кодирования в целом. Спасибо огромное! – Scy

1

charPool = stringPool.toCharArray() заменит массив, наделив новым, который по-видимому получил только 98 символов в нем.

Если ваша цель - скопировать символы строки в другой массив символов, используйте arrayCopy.

3

С

charPool = stringPool.toCharArray(); 

создать новый массив char[], которые могут иметь длину меньше, чем 102. Изменение вашего состояния петлевой

for(int i=0; i < charPool.length; i++){ 

для обработки элементов в допустимом диапазоне.

0

Метод getTiles() дают строку случайных плитки, количество плитки зависит от numbersOfTiles. Но в charPool, когда вы использовали один символ, char будет заменен на «0», вы не будете использовать его снова.

Метод poolReset(), вы сбросите все символы, все '0' будут заменены оригинальными символами.

Метод getTilesRemaing(), вы начинаете цикл из индекса 0, но длина charPool составляет всего 99, поэтому вам нужно положить 99 вместо 102. И очень плохая идея использовать магическое число для цикла. Как упоминалось выше, лучше использовать charPool.length. Таким образом вы можете оставить исключение. Эта функция дает вам количество плиток. Если вы имеете в виду буквы - это плитки, вы должны изменить: charPool [i] == '0' на charPool [i]! = '0' или вернуть charPool.length - tilesRemaing.

Метод isEmpty(), он имеет ту же проблему с getTilesRemaing(). вы никогда не сможете достичь индекса 102.

И кнопка отладчика IDE всегда является вашим лучшим другом!

0

Член charPool не инициализируется, как вы думаете.

public Pool(){ 
    System.out.println("before: " + charPool.length); 
    charPool = stringPool.toCharArray(); 
    System.out.println("after: " + charPool.length); 
} 

выходы:

before: 102 
after: 99 

Короче говоря, использовать методы (длина), доступных на вашем datastructures и не трудно кода значения (102) повторно в код.

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