2017-10-27 1 views
0

Java에서 문자를 입력하는 사용자가 실제로 문자를 입력 할 때까지 문자를 묻는 방법을 작성하는 데 문제가 있습니다. 그렇다면이 방법을 사용하여이 편지를 보내주십시오.조건이 충족 될 때까지 입력을 요청하고이 입력을 반환하는 방법

그래서 사용자가 "2"를 입력하면 메서드에서 문자를 다시 요청하려고합니다.

아래 코드를 작성했지만 문자가 루프 내부에서 작성되어 루프 외부에서 리턴 할 수 없습니다.

public String askForLetter() { 
    Scanner in = new Scanner(System.in); 
    int flag = 1; 
    do { 
     System.out.println("Type a letter"); 
     String letter = in.next(); 
     if (isLetter(letter)) { 
      flag = 2; 
      return letter; 
     } else 
      throw new IllegalArgumentException("Illegal argument, try again"); 
    } while (flag == 1) 
    return letter; 
} 

어떻게 이런 종류의 문제를 해결할 수 있습니까?

+0

루프 앞에 기본값 (""이 될 수 있음)을 지정하고 루프 내부에 입력 값을 할당하십시오. –

+0

그래서 사용자가 편지를 입력 할 때까지 프로그램을 종료해서는 안된다는 것을 이해할 수 있습니까? –

+0

그렇듯이 루프의 반복은 하나뿐입니다. 성공했거나 값을 반환하거나 실패하고 '예외'가 throw됩니다. 'while'조건은 절대로 평가되지 않습니다. – Berger

답변

1

여기 몇 가지 문제가 있지만 다행히도 모두 매우 쉽게 해결됩니다.

먼저, 유효한 입력을 얻을 때까지 루프를 계속 진행하십시오. 예외를 throw하는 것은 이 아닌의 일반적인 경로를 계속 수행하므로 예외가 throw됩니다. 여기에는 필요하지 않습니다.

루프 내부에는 return letter도 필요하지 않습니다. 실제로 아무 것도 아프지 않지만 외부로 return이 중복되게 만듭니다. 따라서 가독성과 좋은 디자인을 위해, 그것을 제거하는 것이 이상적입니다.

마지막으로 루프 내에서 변수가 정의된다는 사실에 대한 주요 관심사는 변수 범위라는 문제를 다루는 것입니다. 변수의 범위는 그것이 속해있는 가장 작은 중괄호로 둘러싸인 블록입니다 (대략). 따라서 루프 외부에서 액세스하려는 경우 루프 외부에서 선언하고 기본값을 할당하십시오.

public String askForLetter() { 
    Scanner in = new Scanner(System.in); 
    int flag = 1; 
    String letter = ""; 
    do { 
     System.out.println("Type a letter"); 
     letter = in.next(); 
     if (isLetter(letter)) { 
      flag = 2; 
     } 
    } while (flag == 1) 
    return letter; 
} 
+0

작동, 감사합니다! –

+2

if 절에 중괄호를 추가하십시오. 생략 된 중괄호는 코드가 변경 될 때 버그가 될 수 있습니다. –

0

나는 아주 늦지 않았 으면 좋겠다. 그러나 나는 더 간단한 대답을 제안 할까? 그것은 Silvio의 방법과 동일하지만 중간에 불필요한 검사를 꺼 냈습니다.

do-while에는 조건이 이미 있으므로 깃발의 상태를 변경하는 대신 문자 자체를 간단히 확인할 수 있습니다. 또한 실비오 (Silvio)가 말했듯이, 우리는 이것이 가능한 한 간단하고 읽기 쉽도록하고 싶습니다.

관련 문제