所以我正在练习我的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; }
}
答案 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;
...
}