2009-11-29 100 views
0

當調用自定義類上的方法時,會出現空指針異常。我不明白爲什麼我的類Player的對象p是null。 (玩家是我的遊戲的一類玩家)玩法就是這種方法。這個類應該創建n個Player類的p個對象並對它們運行play方法。Java NullPointerException當我調用自定義類上的方法時

import java.util.*; 
public class PsychicGameMore 
{ 
    private ArrayList <Player> players; 
    private int orginalNumber; 
    private Player p; 

    public PsychicGameMore() 
    { 



     int n; 
     Scanner s; 
     s = new Scanner(System.in); 
     System.out.println("How many players will there be?, Please enter a number"); 
     n = s.nextInt(); 
     players = new ArrayList<Player>(n); 

     //for loop to create n number of Players 
     for(int i = 0; i < n; i++) 
     { 
      Player p; 
      p = new Player(); 


      players.add(p); 
     } 

     orginalNumber =0; 


    } 

    public void play() 
     { 
     Random myRandom; 
     myRandom = new Random(); 

    do 
    { 
    orginalNumber = myRandom.nextInt(6)+1; 
    System.out.println("The computer has choosen the number " + orginalNumber); 
    p.play(); 

     if(orginalNumber == p.getGuessedNumber()) 
     { 
     System.out.println(p.getName() + " has won!!!!!!!!!!!!!!!!"); 
     } 

     } while((orginalNumber != p.getGuessedNumber())); 


    } 
} 

感謝您的任何幫助。

+0

空指針在哪裏?你有一個全局播放器p,並在for循環中再次定義本地。我甚至不會對代碼風格發表評論... – Trick 2009-11-29 17:42:00

+0

我知道代碼風格可以改進工作 – 2009-11-29 17:46:36

+0

nullpointer在p.play(); – 2009-11-29 17:47:40

回答

1

你的代碼需要很多工作,但是這會讓你通過NPE。問題是您的私人數據成員Player從未初始化。

package psychic; 

import java.util.*; 

public class PsychicGameMore 
{ 
    private ArrayList<Player> players; 
    private int orginalNumber; 

    public static void main(String[] args) 
    { 
     PsychicGameMore game = new PsychicGameMore(); 
     game.play(); 
    } 

    public PsychicGameMore() 
    { 
     int n; 
     Scanner s; 
     s = new Scanner(System.in); 
     System.out.println("How many players will there be?, Please enter a number"); 
     n = s.nextInt(); 
     players = new ArrayList<Player>(n); 

     //for loop to create n number of Players 
     for (int i = 0; i < n; i++) 
     { 
      Player p; 
      p = new Player(); 


      players.add(p); 
     } 

     orginalNumber = 0; 
    } 

    public void play() 
    { 
     Random myRandom; 
     myRandom = new Random(); 

     boolean hasWon = false; 
     do 
     { 
      orginalNumber = myRandom.nextInt(6) + 1; 
      System.out.println("The computer has choosen the number " + orginalNumber); 
      for (Player player : players) 
      { 
       player.play(); 

       if (orginalNumber == player.getGuessedNumber()) 
       { 
        System.out.println(player.getName() + " has won!!!!!!!!!!!!!!!!"); 
        hasWon = true; 
       } 

      } 
     } while (!hasWon); 
    } 
} 
+0

謝謝,我已經美化了我的代碼。我知道這很難閱讀。我將致力於發佈更好的縮進代碼。我沒有得到的是for(Player player:players)循環。 謝謝 – 2009-11-29 18:32:15

+0

那麼,爲什麼不投票答案,如果你已經接受了? – duffymo 2009-11-29 18:57:12

+0

我現在有了,再次感謝您的幫助 – 2009-11-29 19:05:25

4

您將相當多的Player s分配給您的陣列列表players,但您從未將其分配給p。請注意,在循環中:

for(int i = 0; i < n; i++) 
    { 
     Player p; 
     p = new Player(); 

     players.add(p); 
    } 

本地p將對象隱藏在對象中。目前還不清楚你想要什麼樣的對象級別的對象級別的值,所以我不知道如何糾正你的代碼。

你也應該確保你的塊縮進保持一致。現在很難遵循你的代碼。如果你使用eclipse,通過突出顯示整個混亂並按下ctrl-i來修復它。

0

p在

p.play(); 

爲空。你永遠不會創造它。 Player初始化的唯一實例是你添加到ArrayList集合中的實例。

+0

我想調用ArrayList集合中的播放方法 – 2009-11-29 18:07:06

0

您的班級屬性private Player p沒有實例化,因此當您在play()方法中調用p.play()時,您會得到一個NPE。在致電p.play()之前實例化private Player p

相關問題