2015-09-13 114 views
0

我對Java很新,並且在分配時遇到問題。出於某種原因,我只會變爲空。有什麼我做錯了嗎?Java:僅返回null

public class Dieprint 
{ 
    public static void main(String[]args) 
    { 
     Die die1 = new Die(); 
     die1.roll(); 
     die1.toString(); 
     die1.print(); 
    } 
} 

class Die 
{ 
    //instance variables 
    private int faceValue; 
    private int numSides; 
    private String faceValue2; 

    //constructor 
    public Die() 
    { 
     numSides = 6; 
     faceValue = roll(); 
    } 

    //accessors 
    public int getValue() { return faceValue; } 

    //mutators 
    public int roll() 
    { 
     faceValue = (int)(Math.random()*numSides + 1); 
     return faceValue; 
    } 
    //methods 
    public String toString() 
    { 
    String faceValue2 = ("" + faceValue); 
    return faceValue2; 
    } 

    public String print() 
    { 
    System.out.println("Result is: " + faceValue2); 
    return faceValue2; 
    } 
} 

我試圖讓toString方法返回faceValue本身,但是根本不起作用。 我真的很感謝任何幫助。

+0

擺脫faceValue2字段,因爲除了混淆之外,它沒有其他用途。另外,爲什麼你有打印方法呢? –

回答

0

在該方法中public String toString()你的所作所爲是啓動一個新的變量faceValue2。即使你的字段中已經有了這個變量,當你寫String faceValue2 = {"" + faceValue)(強調字符串)時,你現在指向另一個名爲faceValue2的變量,它不再是你的字段中的faceValue2。

如果您瀏覽一下代碼,打印會發生在您的打印方法中,其中存在名爲faceValue2的變量。這個變量指向你的字段中的faceValue2,因爲它在你的toString()方法中沒有被改變,它仍然是空的。因此,當你打印時,你會得到空。

,你能做些什麼來解決這個問題只需刪除關鍵字串,使您的代碼

public String toString(){ 
    faceValue2 = "" + faceValue; 
    return faceValue2; 
} 

這將保證你改變在你的領域的變量,這將反過來改變變量在print()方法,因此,更改運行代碼後得到的輸出。

+0

非常感謝,它效果很好!另外,我明白我現在出錯了。 – blakeopolis

+0

任何時候,我很高興我能幫上忙。儘管如此,您的打印方法和字符串方法都會返回數據的字符串表示形式。它們在技術上是相同的方法,因此您有冗餘代碼。如果你想保留你的print()方法,我建議你使它成爲一個無效的方法,只包含System.out.println(* sample data here *)。祝你好運。 – iskandarchacra

0

建議:

  • 擺脫faceValue2變量print()方法,因爲他們並沒有別的,而不是混淆的目的。
  • 而是打印出toString結果:System.out.println(die1);。這將打印從Die的toString方法返回的值。

例如

public class DiePrint { 
    public static void main(String[] args) { 
     Die die = new Die(); 
     System.out.println(die); 
     die.roll(); 
     System.out.println(die); 
    } 
} 

class Die { 
    private static final int DEFAULT_NUM_SIDES = 6; 
    private int faceValue; 
    private int numSides; 

    // default constructor 
    public Die() { 
     this(DEFAULT_NUM_SIDES); 
    } 

    // if numSides can vary, then have a constructor that will 
    // allow one to set it. 
    public Die(int numSides) { 
     this.numSides = numSides; 
     roll(); // no need to set numSides when rolling. it's already done 
    } 

    // accessors should reflect the field name 
    public int getFaceValue() { 
     return faceValue; 
    } 

    public int getNumSides() { 
     return numSides; 
    } 

    // mutators 
    public int roll() { 
     faceValue = (int) (Math.random() * numSides + 1); 
     return faceValue; 
    } 

    // methods 
    public String toString() { 
     String faceValue2 = ("" + faceValue); 
     return faceValue2; 
    } 

}