2015-02-05 351 views
0

我似乎無法弄清楚有什麼不對或爲什麼它給我它的輸出,我會複製&粘貼我的代碼爲兩個類和我得到的控制檯輸出,也許有人比我更好在Java可以幫助想出解決辦法,我敢肯定這件事情簡單:
一流ArrayIndexOutOfBounds異常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 2015-02-05 15:44:52

+2

在Java中,數組有長度屬性,這是有原因的。 – meskobalazs 2015-02-05 15:46:16

+0

看起來像你只是在一些'for'週期有索引範圍的錯誤。不要懶惰 - 使用調試器並檢查它。 :) – sphinks 2015-02-05 15:46:41

回答

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循環是這樣的:

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

它會「o utofindex」。您可能希望上述循環更改爲:

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

101個字符,但其他所有的都是好的。 – 2015-02-05 15:55:07

+0

我認爲有99個字符,因爲他沒有將zeroPoint添加到stringPool中。 – 2015-02-05 15:57:31

+0

謝謝!我認爲最大的缺點是我使用了直接的102而不是charPool.length;一般來說,這只是非常糟糕的編碼練習。非常感謝! – Scy 2015-02-05 17:47:00

1

charPool = stringPool.toCharArray()將取代你用新的那顯然是分配的陣列只有在它得到了98個字符。

如果您的目標是將字符串的字符複製到另一個字符數組中,請使用arrayCopy。

3

隨着

charPool = stringPool.toCharArray(); 

您創建一個新的陣列char[]這可能有一個長度小則102更改你的循環條件

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

處理在有效範圍內的元素。

0

的getTiles()方法給出隨機瓷磚的字符串,瓷磚的數量取決於numbersOfTiles。但在charPool中,當您使用一個字符時,字符將被替換爲'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 

總之,使用您數據結構的可用方法(長度)和不硬編碼的值(102)反覆到您的代碼。