gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:01:33 26 4
gpt4 key购买 nike

所以我正在练习我的 Java 技能,在没有寻求帮助的情况下尝试和思考 2.5 小时后,我有点迷路了......

问题出在 Welcome 类中,我正在设置用户名和角色。但在终端中我想通过 Getter 使用用户名,但结果为空

检查下面的类

欢迎类:

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; }

}

最佳答案

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

看看您在代码中看到 new Player() 的次数。每次看到它时,您都在这样做,即创建一个 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 it has to be static otherwise i cant use it.... for some reason..

不!那么你正在修复错误的东西。关键是修复您的代码,使其不必是静态的


look here : /home/stefano/intelliJ_Projects/Roots/src/com/stefano/Welcome.java Error:(32, 14) java: non-static method ruler() cannot be referenced from a static context Error:(44, 14) java: non-static method ruler() cannot be referenced from a static context Error:(45, 17) java: non-static method terminal() cannot be referenced from a static context

同样,正如我的代码所示,摆脱静态标尺方法,而只使用非静态方法。 Ruler 类必须有状态,必须有非静态变量,所以你应该在类的对象上调用实例方法,而不是静态方法。恐怕你在倒退。

关于Java 从 getUsername() 获取 NULL 值; (不同的类文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com