Java从getUsername()获取NULL值; (不同的类文件)

时间:2014-10-14 20:48:22

标签: java file class null

所以我正在练习我的java技能,经过2.5小时的尝试和思考而没有求助,我有点失落......

问题出在欢迎我正在设置用户名和角色的类中。 但在终端我想通过Getter使用用户名,但它出现了null

检查下面的课程

欢迎课程:

public class Welcome {

    public static void welcome(){
        Player m = new Player();
        String user;
        String roletype;
        Float startersmoney;
        // welcome msg
        System.out.println("Welcome to 'Roots'.");

        //enter your desired username
        System.out.println("Enter your alias : ");
        Scanner scanner = new Scanner(System.in);
        Ruler.ruler();
        user = scanner.nextLine();
        m.setUsername(user);
        // returns username

        System.out.println("Your alias is now set to : " + m.getUsername());
        // are you a hacker?
        System.out.println("What are you? a 'hacker' or ? ");
        Ruler.ruler();
        roletype = scanner.nextLine();
        m.setRole(roletype);
        m.setCurrency(250.00);
        //checks user input. and gives output
        if (m.getRole().equalsIgnoreCase("hacker")) {
            System.out.println("So you are a : " + m.getRole().toLowerCase());
        } else {
            System.out.println("hahahaha... NOOOOB!!!\n only hackers are allowed to play 'Roots'..");
        }
        System.out.println("Okay lets get started. hint : 'help' ");
        Ruler.ruler();
        Terminal.terminal();
    }

标尺类

  public class Ruler {

    // for input markup '@root:~ > ' <- feels like terminal :D
    public static void ruler(){
        Player r = new Player();
        System.out.print(r.getUsername() + "@root:~ > ");
    }
}

玩家类

public class Player {

    //variables
    private String username;
    private String role;
    private double currency;

    //setters
    public void setUsername(String value)   {   this.username = value;      }
    public void setRole(String role)        {   this.role = role;           }
    public void setCurrency(Double currency){   this.currency = currency;   }

    //getters
    public String getUsername() {   return this.username;        }
    public String getRole()     {   return this.role;            }
    public Double getCurrency() {   return this.currency;        }

}

2 个答案:

答案 0 :(得分:1)

您的问题很常见 - 创建对象的新实例并期望它神奇地获取同一类的其他对象的状态。这不是Java的工作方式。

查看您在代码中看到new Player()的次数。每当你看到它时,你就是这样做的,创建一个 new Player对象,一个与其他对象不同。因此,设置一个状态对正在检查其状态的另一个状态没有影响。

解决方案:通过传递引用,仅检查先前创建的Player对象的状态。不要在监听器代码中创建新的。

所以:

public class Ruler {
   private Player player;

   public Ruler(Player player) {
      this.player = player;
   }

    // **** this shouldn't be static!
    public void checkState(){
        // Player r = new Player();
        // System.out.print(r.getUsername() + "@root:~ > ");
        System.out.print(player.getUsername() + "@root:~ > ");
    }
}

然后在

public static void main(String[] args) {
    Player player = new Player();
    Ruler ruler = new Ruler(player);

    // now call player and ruler methods as desired
}

修改
你说:

  

.btw它必须是静态的,否则我无法使用它......出于某种原因......

NO!然后你正在修复错误的事情。关键是修复您的代码,以便不必是静态的


  

看这里:/home/stefano/intelliJ_Projects/Roots/src/com/stefano/Welcome.java错误:(32,14)java:非静态方法ruler()无法从静态上下文引用错误:( 44,14)java:非静态方法ruler()不能从静态上下文引用错误:(45,17)java:非静态方法terminal()不能从静态上下文引用

同样,正如我的代码所示,摆脱静态标尺方法,而只使用非静态方法。 Ruler类必须具有state,必须具有非静态变量,因此您应该在类的对象上调用实例方法,而不是静态方法。你害怕做事情倒退了。

答案 1 :(得分:1)

您应该在显示之前初始化播放器的用户名。例如,在创建新播放器后,设置用户名的值。

public class Ruler {

    // for input markup '@root:~ > ' <- feels like terminal :D
    public static void ruler(String username){
        Player r = new Player();
        r.setUserName(username); // Here you can give it a value

        System.out.print(r.getUsername() + "@root:~ > ");
    }
}

在欢迎课程中

public class Welcome {

    public static void welcome(){
        ....

        //enter your desired username
        System.out.println("Enter your alias : ");
        Scanner scanner = new Scanner(System.in);
        user = scanner.nextLine();
        Ruler.ruler(user);
        ...

}

标尺应具有播放器属性

public class Ruler {
   private Player player;
   ...
}