2016-07-23 78 views
-2

我不知道爲什麼,但每當我選擇在我做的while循環它不會終止。如何在while循環中終止do方法?

public class testClinic{ 
     public static void main(String[]args){ 
     Clinic c=new Clinic(); 
     do{ 
      c.details(JOptionPane.showInputDialog("[P]roceed","\n[D]one")); 
     }while(!c.details().equals("D")); 
} 
} 
+1

請提供'Clinic.details(String)'的代碼。請注意,「細節」方法和「細節」字段不是同一件事。 –

+0

請提供編譯的代碼(最後有​​一個不平衡的括號)。 – dasblinkenlight

+0

我會建議編寫不依賴於診所類中隱藏細節的代碼。代碼可能工作,但很難維護。 – Roland

回答

1

我會盡量回答你的問題,但你真的沒有提供足夠的關於你的代碼的細節,以確保我的答案能幫助你。

我最好的猜測是,你Clinic類看起來是這樣的:

public class Clinic { 
    public String details; 

    public void details(String input) { 
     details = input; 
    } 
} 

我注意到的第一件事是,你要JOptionPane.showInputDialog電話似乎並不做你想要什麼。再次,我只根據提供的信息猜測你想要什麼。我想你想要一個對話框,要求用戶輸入兩個輸入中的一個 - 要麼P代表「繼續」,要麼D代表「完成」。如果你看的Javadoc JoptionPane你會看到你的代碼調用this method這是造成你的對話框出現這樣的:

enter image description here

現在,如果你只需點擊OK此對話框,您Clinic類與上面顯示的類似,那麼details字段設置爲「[D] 1」,顯然,它不等於「D」,因此您的循環永遠不會結束。

如果更改調用details方法的行:

c.details(JOptionPane.showInputDialog("[P]roceed\n[D]one","D"));

你會得到你想要的東西 - 迅速將看起來像這樣:

enter image description here

和當你按下OK鍵時,循環結束。

有些事情要考慮關於你的代碼:

  1. JOptionPane.showInputDialog調用返回用戶輸入的文本。如果用戶按Cancel,當循環嘗試訪問c.details時(假設Clinic按上述方式工作),將會得到一個java.lang.NullPointerException異常
  2. 一般來說,您應該始終使用常量優先級編寫您的equals比較和第二個變量,以避免任何NullPointerException的可能性。例如在您的代碼中:}while(!c.details.equals("D"));將更改爲}while(!"D".equals(c.details));
  3. 您通常不應公開某個類的字段。直接訪問對象的內部數據可能會使代碼更難以維護(正如@Roland在評論中提到的那樣)。而是使用getter和setter方法。對this question的接受答案更詳細地解釋了這一點。