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

时间:2013-10-11 10:14:48

标签: java

基本上我做了这个程序,计算机生成随机卡。我创建了一个名为'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;
    }
}
}

5 个答案:

答案 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字段rndsuitrndnumber,因此它们是null

考虑向两个类添加构造函数,以初始化intString字段。

例如

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)

您可以通过向rndnumberrndsuit类添加构造函数来解决此问题。

将以下内容添加到rndnumber类:

public rndnumber() {
    rnd();
}

将此添加到rndsuit类:

public rndsuit() {
    suit();
}