3

基本上我做了这个程序,计算机生成随机卡。我做了一个名为'rndnumber'的类,这个类生成随机数。然后我制作了另一个名为“rndsuits”的类,这会生成随机套装。问题是当我去我的主课并执行代码时,我得到的是 null 而不是数字和西装。有谁知道为什么?我的输出基本上是:这是你的随机卡:null of 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;
    }
}
}
4

5 回答 5

6

您需要在获取值之前调用方法。

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);
    ...
}
于 2013-10-11T10:23:48.983 回答
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 命名约定。,类名以大写字母开头。

于 2013-10-11T10:16:28.567 回答
0

您永远不会初始化String字段rndsuitrndnumber因此它们是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;
    }
}
于 2013-10-11T10:18:26.270 回答
0

您正在实例化新对象,但构造函数并未将随机数分配给类内的变量。

rndnumber h = new rndnumber();

正在创建一个新对象。但是在任何时候都没有将字符串编号设置为该类中的任何内容。

private String number;

稍后您返回该字符串,该字符串仍然为空。

public String getString(){
    return number;
}
于 2013-10-11T10:18:38.553 回答
0

rndnumber您可以通过向和rndsuit类添加构造函数来解决此问题,如下所示。

将以下内容添加到rndnumber类中:

public rndnumber() {
    rnd();
}

将此添加到 rndsuit 类:

public rndsuit() {
    suit();
}
于 2013-10-11T10:35:23.187 回答