访问getter时,方法返回null

时间:2014-01-27 20:10:26

标签: java

我一直在尝试将播放器名称(使用Scanner)打印到屏幕上,但它不断给我null而不是人物类型。

如下所示,使用playerOneName方法时正确显示playerName(),但只要我尝试使用startingHouse()方法,就会显示null }。

更新:已添加解决方案:

必须在Player_Information类中添加以下代码:

    public Player_Information(){
    super();
    playerName();
    }

头等舱:

public class Player_Information {

    Scanner inputName = new Scanner(System.in);
    private String playerOneName;

    void playerName() {
        System.out.print("What is your name? - ");
        playerOneName = inputName.nextLine();
        System.out.println("Greetings " + playerOneName + "!\n");
    }

    public String getPlayerOneName() {
        return playerOneName;
    }

    public void setPlayerOneName(String playerOneName) {
        this.playerOneName = playerOneName;
    }
}

第二课:

public class Locations {

    Player_Information plIn = new Player_Information();

    public void startingHouse() {
        System.out.println(plIn.getPlayerOneName() + ": Agh.. What happened..");
    }
}

我指的是getPlayerOneName()类中的Player_Information,为什么它会返回null

谢谢:)

4 个答案:

答案 0 :(得分:2)

您将获得null,因为您从未初始化playerOneName。此String在PlayerName()方法中初始化为inputName.nextLine();的值。为了在使用getPlayerOneName()方法时获得值,必须首先初始化变量playerOneName。在您的程序中,方法PlayerName()初始化变量,因此首先调用该方法。

public class Locations {

    Player_Information plIn = new Player_Information();

    public void startingHouse() {
        plIn.PlayerName(); // call this first to initialize playerOneName;
        System.out.println(plIn.getPlayerOneName() + ": Agh.. What happened..");
    }
}

处理此错误的一种更好的方法是在您的Player_Information类中添加一个构造函数,该类可以初始化该变量。下面代码中的某些内容可以...

/*add this to your Player_Information class at the beginning */
public Player_Information(){
    super();
    //one option is to set a value to playerOneName here...
    playerOneName = "set whatever string value you want to use here";
    //or...call PlayerName() here instead.
    PlayerName();
}

答案 1 :(得分:1)

您需要先调用此方法playerName(),因此:

plIn.playerName();//this will prompt for input
System.out.println(plIn.getPlayerOneName() + ": Agh.. What happened..");

但是,整个设计看起来很奇怪。我建议将您的扫描仪与Player_Information课程分开。并为Player_Information添加一个setter。

答案 2 :(得分:0)

此行Player_Information plIn = new Player_Information();调用Player_Information的默认构造函数(因为您没有定义一个),并且您从未初始化playerOneName字段(因为您没有调用playerName()字段1}}方法。您可以定义像这样的构造函数

public Player_Information() {
  super();
  playerName(); // <-- will invoke the function on instantiation.
}

答案 3 :(得分:0)

创建对象时

Player_Information plIn = new Player_Information();

此时属性playerOneName为null,因此您需要调用方法playerName来设置属性值。