2015-11-21 111 views
0

我正在嘗試編寫一個代碼,其中我構造了一個52張牌堆,然後將這些牌交給n個玩家(對於某些玩家可能有額外的牌)。獲勝者是擁有黑桃王牌的人。數組越界java

這裏是我的程序:

public class CardGame { 
    public static void main(String[] args) { 
    System.out.println("Enter the number of players"); 

    int numofPlayers = Integer.parseInt(args[0]); 
    CardPile gameDeck = CardPile.makeFullDeck(); 
    CardPile [] players = new CardPile[numofPlayers]; 

    for (int i=0;i<numofPlayers;i++) { 
     int numofnum = i%numofPlayers; 
     players[i] = new CardPile(); 
    } 

    for (int i=0;i<52;i++) { 
     int numofnum =i%numofPlayers; 
     CardPile curPlayer = players[i%numofPlayers]; 
     Card nextCard = gameDeck.get(i); 
     players[numofnum].addToBottom(nextCard); 

    } 
    for (int i=1;i<numofPlayers;i++) { 
     if (players[i].find(Suit.SPADES, Value.ACE) != -1) { 
     System.out.println("Player" + i + "has won!"); 
     } 
    } 

    } 
} 

我不斷收到出界失誤。我在這個程序中調用的方法寫得很好,所以問題應該來自這個代碼。誰能幫忙?

編輯:這是錯誤,我得到

java.lang.ArrayIndexOutOfBoundsException: 0 
    at CardGame.main(CardGame.java:5) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 
> 

謝謝!

+1

究竟在哪一行你會得到'ArrayOutOfBoundsException'?請同時發佈錯誤的完整堆棧跟蹤。 – Blip

+0

你能指出'CardGame'類的第5行嗎? – Blip

+0

這是命令行參數吧? – Jayzpeer

回答

3

你在詢問玩家的數量,但不是閱讀輸入;相反,您正在閱讀參與計劃的參數來計算玩家人數。

可能你沒有在命令行傳遞任何參數,所以當你詢問args[0]時,它會拋出一個異常。

你會想要在程序中從控制檯獲取輸入,或者在運行程序時傳遞玩家人數(在這種情況下,可以刪除println)。

+2

我認爲這是可能的情況,儘管OP尚未公佈該例外的細節。 – Blip

+0

我真的是一個初學者......你能否詳細說明一下? – Jayzpeer

+0

@Jayzpeer你如何運行你的java代碼? – Raf

3

正如Alex在他的回答中解釋的那樣,原因是因爲您在運行代碼時沒有傳遞參數。如果你希望的代碼,然後工作,你必須運行你的代碼如下:

java CardGame 5 

以上執行你CardGame類,並通過5作爲參數傳遞給main方法在args [0]。如果您通過某個IDE執行代碼,那麼我們假設Eclipse,然後請查看此question中的答案,以瞭解如何傳遞參數。

如果您要更換上面的代碼(以接受來自用戶的輸入),那麼請替換下面的行

int numofPlayers = Integer.parseInt(args[0]); 

通過下面的一行

Scanner input= new Scanner(System.in); 
int numofPlayers = input.nextInt(); 

執行的代碼會問你後輸入玩家人數並輸入+ ve的整數值。

如果您使用掃描儀選項,請確保您的輸入值不是整數(以及負整數)。例如,如果輸入是以任何形式提供,但是是整數,那麼您將得到InputMismatchException因此,圍繞您的輸入以try{} and catch(){}捕捉以上例外將是正確的方式去解決它。