基本上我做了这个程序,计算机生成随机卡。我创建了一个名为'rndnumber'的类,这个类生成随机数。然后,我创建了另一个名为'rndsuits'的类,这会生成随机套装。 问题是当我去我的主类,并执行代码时,我得到的是null而不是数字和套装。谁知道为什么?我的输出基本上是: 这是你的随机卡:null null。
public class maincard {
public static void main(String[] args){
System.out.println("Here is your random card");
rndnumber h = new rndnumber();
rndsuit a = new rndsuit();
System.out.println(h.getString() + " of " + a.getStringz());
}
}
public class rndnumber {
private int rndnumber = (int) (Math.random()*13+1);
private String number;
public String getString(){
return number;
}
public void rnd(){
switch (rndnumber){
case 1:
number = "Ace";
break;
case 2:
number = "2";
break;
case 3:
number = "3";
break;
case 4:
number = "4";
break;
case 5:
number = "5";
break;
case 6:
number = "6";
break;
case 7:
number = "7";
break;
case 8:
number = "8";
break;
case 9:
number = "9";
break;
case 10:
number = "10";
break;
case 11:
number = "Jacks";
break;
case 12:
number = "Queens";
break;
case 13:
number = "Kings";
break;
}
}
}
public class rndsuit {
private int y = (int) (Math.random()*3+1);
private String rndsuit;
public String getStringz(){
return rndsuit;
}
public void suit(){
switch(y){
case 1:
rndsuit = "Spades";
break;
case 2:
rndsuit = "Cloves";
break;
case 3:
rndsuit = "Hearts";
break;
case 4:
rndsuit = "Diamonds";
break;
}
}
}
答案 0 :(得分:6)
您需要在获取值之前调用方法。
h.rnd();
a.suit();
System.out.println(h.getString() + " of " + a.getStringz());
这将解决null问题。
但是还有另外一个问题在休息室等着你。除非您反复创建新对象并使用该对象访问值,否则上述修复将始终返回相同的值。
您需要在rnd()
和suit()
这样的方法中移动随机生成器部分,以便始终返回新的随机值。
public void suit() {
y = (int) (Math.random() * 3 + 1);
...
}
public void rnd() {
rndnumber = (int) (Math.random() * 13 + 1);
...
}
答案 1 :(得分:1)
你需要在获得之前设置它们。
您正在使用rnd()
,suit()
方法设置值,但您永远不会调用它们。
rndnumber h = new rndnumber();
h.rnd();
rndsuit a = new rndsuit();
a.suit();
System.out.println(h.getString() + " of " + a.getStringz());
除非您调用这些方法,否则最终会获得默认值,即null
。
作为旁注:请注意java naming conventions.,班级名称以大写字母开头。
答案 2 :(得分:0)
您永远不会初始化String
字段rndsuit
和rndnumber
,因此它们是null
。
考虑向两个类添加构造函数,以初始化int
和String
字段。
例如
public class RandomSuit {
// theses should never change so make them final
private final int y;
private final String rndsuit;
public RandomSuit() {
this.y = (int) (Math.random()*3+1);
this.rndsuit = rnd(y);
}
// find the String representation of the random number
private static String rnd(rndnumber){
switch (rndnumber){
case 1:
return "Spades";
case 2:
return "Cloves";
...
}
}
//override Object's toString instead of using getString
@Override
public String toString(){
return rndsuit;
}
}
答案 3 :(得分:0)
您正在实例化新对象,但构造函数不会将随机数分配给类中的变量。
rndnumber h = new rndnumber();
正在创建一个新对象。但是在任何时候都没有将字符串数设置为该类中的任何内容。
private String number;
稍后您将返回该字符串,该字符串仍为空。
public String getString(){
return number;
}
答案 4 :(得分:0)
您可以通过向rndnumber
和rndsuit
类添加构造函数来解决此问题。
将以下内容添加到rndnumber
类:
public rndnumber() {
rnd();
}
将此添加到rndsuit类:
public rndsuit() {
suit();
}