2016-07-23 7 views
-2

이유는 모르겠지만 언제든지 do do while 루프에서 완료를 선택하면 종료되지 않습니다.main 메소드에서 do while 루프를 종료하는 방법은 무엇입니까?

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)'에 대한 코드를 제공해주십시오. 'details' 메쏘드와'details' 필드는 같은 것이 아니라는 것에주의하십시오. –

+0

컴파일 할 코드를 제공하십시오 (끝에 불균형 괄호가 있음). – dasblinkenlight

+0

Clinic 클래스의 숨겨진 세부 정보에 의존하지 않는 코드를 작성하는 것이 좋습니다. 코드가 제대로 작동하지만 유지 관리가 어려울 수 있습니다. – Roland

답변

1

나는 당신의 질문에 대답하려고합니다,하지만 내 대답은 당신을 도울 것입니다 확인하기 위해 당신이 정말로 당신의 코드에 대한 충분한 정보를 제공하지 않습니다.

public class Clinic { 
    public String details; 

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

내가주의 첫 번째 일이 JOptionPane.showInputDialog에 전화 당신이 원하는 일을 할 나타나지 않는다는 것입니다 :

내 추측은 Clinic 클래스 이런 식으로 뭔가를 보이는 것입니다. 다시 말하지만, 나는 단지 당신이 원하는 정보가 무엇인지에 따라 추측하고 있습니다. 사용자가 두 개의 입력 중 하나를 묻는 대화 상자를 원한다고 생각합니다. "진행"의 경우 P 또는 "완료"의 경우 D 중 하나를 입력하십시오. 당신이 JoptionPane를위한 JavaDoc를 보면 당신은 당신의 코드는 다음과 같이 표시하기 위해 대화를 일으키는 this method를 호출하는 것을 볼 수 있습니다 :

enter image description here

를 이제, 당신은 단순히이 대화와 Clinic 클래스에 확인을 클릭하면 위의 그림과 비슷하지만 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에 대한 대답이 자세히 설명되어 있습니다.
관련 문제