Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个类检索int时获取null_Java - Fatal编程技术网

Java 从另一个类检索int时获取null

Java 从另一个类检索int时获取null,java,Java,基本上,我做了这个程序,计算机生成一张随机的卡片。我创建了一个名为“rndnumber”的类,这个类生成随机数。然后我创建了另一个名为“rndsuits”的类,它生成了随机套装。 问题是,当我转到我的主类并执行代码时,我得到的是null,而不是数字和数字。有人知道为什么吗?我的输出基本上是: 这是你的随机卡:空的空的 public class maincard { public static void main(String[] args){ System.out.println(

基本上,我做了这个程序,计算机生成一张随机的卡片。我创建了一个名为“rndnumber”的类,这个类生成随机数。然后我创建了另一个名为“rndsuits”的类,它生成了随机套装。 问题是,当我转到我的主类并执行代码时,我得到的是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;
    }
}
}

您需要在开始之前设置它们

您正在
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()
将自动执行。构造函数将在您实例化时被调用,其他方法(静态或非静态)仅在您显式调用时才会执行。否。当您需要它们执行特定任务时,您必须手动调用它们