Java 从另一个类检索int时获取null
基本上,我做了这个程序,计算机生成一张随机的卡片。我创建了一个名为“rndnumber”的类,这个类生成随机数。然后我创建了另一个名为“rndsuits”的类,它生成了随机套装。 问题是,当我转到我的主类并执行代码时,我得到的是null,而不是数字和数字。有人知道为什么吗?我的输出基本上是: 这是你的随机卡:空的空的Java 从另一个类检索int时获取null,java,Java,基本上,我做了这个程序,计算机生成一张随机的卡片。我创建了一个名为“rndnumber”的类,这个类生成随机数。然后我创建了另一个名为“rndsuits”的类,它生成了随机套装。 问题是,当我转到我的主类并执行代码时,我得到的是null,而不是数字和数字。有人知道为什么吗?我的输出基本上是: 这是你的随机卡:空的空的 public class maincard { public static void main(String[] args){ System.out.println(
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;
}
}
}
您需要在开始之前设置它们 您正在
rnd()
,suit()
方法中设置值,但从未调用它们
rndnumber h = new rndnumber();
h.rnd();
rndsuit a = new rndsuit();
a.suit();
System.out.println(h.getString() + " of " + a.getStringz());
除非调用这些方法,否则最终会得到默认值,即null
作为旁注:请遵循,类名以大写字母开头。您从不初始化
字符串字段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;
}
}
您正在实例化新对象,但构造函数没有为类内的变量分配随机数
rndnumber h = new rndnumber();
正在创建新对象。但在任何情况下,字符串编号都不会设置为该类中的任何内容
private String number;
稍后返回该字符串,该字符串仍然为空
public String getString(){
return number;
}
您需要在获取值之前调用这些方法
h.rnd();
a.suit();
System.out.println(h.getString() + " of " + a.getStringz());
这将修复空值问题
但休息室里还有一个问题等着你。上述修复将始终返回相同的值,除非您一次又一次地创建新对象并使用该对象访问该值
您需要在如下方法中移动随机生成器部分,以便rnd()
和suit()
始终返回新的随机值
public void suit() {
y = (int) (Math.random() * 3 + 1);
...
}
public void rnd() {
rndnumber = (int) (Math.random() * 13 + 1);
...
}
您可以通过向rndnumber
和rndsuit
类添加构造函数来解决此问题,如下所示
将以下内容添加到rndnumber
类中:
public rndnumber() {
rnd();
}
将其添加到rndsuit类:
public rndsuit() {
suit();
}
你真的应该为这些数据的孩子们使用枚举。谢谢你的帮助,修复了它。但我还有一个问题,项目中的每个方法不是在编译时都执行吗?或者它仅在您仅从主类调用时执行?方法仅在显式调用时执行,构造函数在类实例化时被调用。只有main()
将自动执行。构造函数将在您实例化时被调用,其他方法(静态或非静态)仅在您显式调用时才会执行。否。当您需要它们执行特定任务时,您必须手动调用它们