2013-10-11 15 views
3

基本上,我在計算機生成隨機卡的地方製作了這個程序。我做了一個叫'rndnumber'的類,這個類生成隨機數。然後我做了另一個叫做'rndsuits'的課程,這會產生隨機訴訟。 問題是,當我去我的主要類,並執行代碼,我得到null,而不是數字和適合。有人知道爲什麼我的輸出基本上是: 這是你的隨機卡片:null爲null。當從另一個類中檢索int時變爲空

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; 
    } 
} 
} 
+0

你真的應該使用枚舉數據這樣的孩子。 – Dariusz

回答

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.,類名以大寫字母開頭。

+0

感謝您的幫助,把它修好了。但是我還有一個問題,當編譯它時,項目中的每個方法都不會執行嗎?或者只有當你只從主類調用它時才執行它? – Tloz

+0

只有在明確調用時纔會執行方法,當實例化類時會調用構造函數。 – Husman

+0

只有'main()'會自動執行。構造函數將在實例化時調用,而其他方法(靜態或非靜態)只有在您明確調用時纔會執行。 – SudoRahul

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; 
    } 
} 
0

您實例化新對象,但構造方法中沒有的類中的變量分配的隨機數。

rndnumber h = new rndnumber(); 

正在創建一個新的對象。但是在任何時候都不會將該字符串編號設置爲該類中的任何內容。

private String number; 

之後,您將返回該字符串,該字符串仍然爲空。

public String getString(){ 
    return number; 
} 
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); 
    ... 
} 
0

您可以通過添加構造的rndnumberrndsuit類作爲folows解決這個問題。

添加以下的rndnumber類:

public rndnumber() { 
    rnd(); 
} 

一下添加到rndsuit類:

public rndsuit() { 
    suit(); 
} 
相關問題