3

基本的に、コンピューターがランダムなカードを生成するこのプログラムを作成しました。「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;
    }
}
}
4

5 に答える 5

6

値を取得する前にメソッドを呼び出す必要があります。

h.rnd();
a.suit();
System.out.println(h.getString() + " of " + a.getStringz());

これにより、null の問題が修正されます。

しかし、ラウンジにはもう 1 つの問題が待っています。上記の修正は、新しいオブジェクトを何度も作成し、それを使用して値にアクセスしない限り、常に同じ値を返します。

常に新しいランダム値を返すには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フィールドrndsuitを初期化することはありませrndnumbernull

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;
    }
}
于 2013-10-11T10:18:26.270 に答える
0

新しいオブジェクトをインスタンス化していますが、コンストラクターはクラス内の変数に乱数を割り当てていません。

rndnumber h = new rndnumber();

新しいオブジェクトを作成しています。しかし、文字列番号がそのクラス内の何かに設定されることは決してありません。

private String number;

後でその文字列を返しますが、これはまだ null です。

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 に答える