2013-11-15 2 views
1

터미널 실행시 문자열 입력을 받아 텍스트 파일에 저장하는 작은 Java 응용 프로그램이 있습니다. 종료 할 응용 프로그램을 묻는 문자열 exit이 있습니다. 그러나 어떤 이유에서 문자열 exit이 루프에 while(!) 루프가 있음에도 불구하고 문서에 추가됩니다. 무엇이 문제 일 수 있습니까?while 루프에서 조건에도 불구하고 스캐너 입력이 텍스트 파일에 추가됩니다.

try{ 
      Scanner scanner = new Scanner(System.in); 
      String input = null; 
      while(!"exit".equalsIgnoreCase(input)){ 
       input = scanner.nextLine(); 
       String fileLocation = "/Users/myName/Dropbox/myDocument.txt"; 
       FileWriter writer = new FileWriter(fileLocation,true); 

       writer.append(returnDate()+": "); 
       writer.append(input + "\n"); 

       writer.flush(); 
       writer.close(); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
+1

코드에 문제가 너무 많습니다. 루프 상태가 처리 된 후 검사하고 있습니다. 또한 반복적으로 새로운 FileWriter를 작성하고 있습니다. 루프 외부에서 FileWriter를 이동하십시오. 'scanner.hasNextLine()'을 루프 조건으로 사용하고 입력이 "exit"문자열과 일치하는지 확인하십시오. – goblinjuice

+0

감사합니다. 필자는 파일 작성자 문제를 해결했습니다. – theGreenCabbage

답변

2

코드를 정신적으로 따릅니다. 루프의 모든 처리를 수행하려면 앞에 while 루프 조건이 다음에 완료 될 때까지 계산됩니다.

당신은이 :

while(!"exit".equalsIgnoreCase(input)){ 
    input = scanner.nextLine(); 
    ... 
    writer.append(input + "\n"); 
    ... 
} 

첫 번째 명령과 사용자 유형 "종료"를 가정하면, 흐름은 다음과 같습니다

  1. input 처음 null입니다.
  2. while 조건이 성공합니다.
  3. input을 읽으면 이제 종료됩니다.
  4. input, 즉 "exit"가 파일에 기록됩니다.
  5. while 루프가 다시 시작되고 조건이 평가되고 실패하면 루프가 다시 실행되지 않습니다.

"exit"가 파일에 기록되었습니다.

파일 쓰기가 발생하지 않도록 논리를 약간 재 작성해야합니다. 이것은 흔치 않은 상황이 아닙니다. 선호도에 따라 다양한 솔루션이 있습니다.

while (!"exit".equalsIgnoreCase(input = scanner.nextLine())) { 
    write input; 
} 

당신은 중복 체크가 (당신의 간단한 예를 들면 이해가되지 않습니다 및도 자주 전체 로직 개선의 여지를 나타냅니다) 수 :

while (input is not exit) { 
    read input; 
    if (input is not exit) write input; 
} 
당신은 while 문에 할당 및 비교를 결합 할 수 있습니다

while (true) { 
    read input; 
    if (input is exit) break; 
    write input; 
} 

이 문제를 해결하는 방법에는 여러 가지가 있습니다

당신은 모든 루프 조건을 사용할 수 없습니다.

+0

아. 나는 그것을 지금 볼 수있다. – theGreenCabbage