2009-11-29 101 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

相关问题