2016-07-23 11 views
-2

理由はわかりませんが、do whileループで終了を選択するたびに終了しません。mainメソッドでdo whileループを終了するには?

+1

「Clinic.details(String)」のコードを入力してください。 'details'メソッドと' details'フィールドは同じものではないことに注意してください。 –

+0

コンパイルするコードを提供してください(最後にアンバランスなカッコがあります)。 – dasblinkenlight

+0

Clinicクラスの隠された詳細に依存しないコードを書くことをお勧めします。コードは機能するかもしれませんが、維持するのは難しいでしょう。 – Roland

答えて

1

私はあなたの質問に答えようとしますが、私の答えがあなたに役立つことを確かめるためにあなたのコードについての十分な詳細を提供していません。

私の最高の推測では、あなたのClinicクラスは、このようなものに見えるということです。

public class Clinic { 
    public String details; 

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

を私が最初に気づくのはJOptionPane.showInputDialogへのお電話は、あなたが望むものをやっているようには見えないということです。繰り返しますが、私はちょっとした情報が提供されていることに基づいて、あなたが望むものだけを推測しています。私はあなたが2つの入力のうちの1つを求めるダイアログを望んでいると思っています--Pは "Proceed"、Dは "Done"です。あなたはJoptionPaneのJavadocを見れば、あなたはあなたのコードは次のように表示されるように、あなたのダイアログを引き起こしているthis methodを呼び出していることがわかります。

enter image description here

を今、あなたは、単にこのダイアログとあなたのClinicクラスに、[OK]をクリックした場合上に示したものと似ていれば、detailsフィールドは "[D] one"に設定されています。明らかに "D"と等しくないので、ループは終了しません。

あなたはこれにdetailsメソッドを呼び出す行に変更した場合:

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

をあなたが望む結果を得るでしょう - プロンプトは次のようになります。

enter image description here

とOKを押すとループが終了します。

あなたのコードについて考慮すべきいくつかの点:

  1. コールJOptionPane.showInputDialogには、ユーザーが入力したテキストを返します。ユーザがキャンセルを押すと、ループがc.detailsにアクセスしようとするとjava.lang.NullPointerExceptionが返されます(上記で概説した通りClinicが動作すると仮定します)
  2. 一般に、equalsの比較は、変数secondは、NullPointerExceptionの可能性を避けるために使用します。たとえば、コード内では}while(!c.details.equals("D"));}while(!"D".equals(c.details));
  3. に変更されます。一般に、クラスのフィールドは公開しないでください。オブジェクトの内部データに直接アクセスすると、コードを難しくすることがあります(@Rolandはコメントに記載されています)。代わりに、getterメソッドとsetterメソッドを使用します。 this questionへの受け入れられた答えは、これをより詳細に説明しています。
関連する問題