2014-10-31 6 views
0

내 프로그램에서 사용자가 1-3 사이의 int 값을 입력하도록 한 다음 입력 값에 기반하여 무언가를 수행하려고합니다. 숫자가 아니거나 옵션 중 하나가 아닌 경우 올바른 옵션을 다시 입력 할 수 있습니다.스캐너를 사용하여 입력 값을 읽는 것은 Java에서 무한 루프를 발생시킵니다.

내가 가지고있는 문제는 무한 루프를 일으키지 않는 방법에 대해 브레인 스토밍하는 데 어려움을 겪고 있으며 콘솔에 잘못된 입력을 입력했다고 알린 후 번호를 입력하도록 허용하고 있습니다.

int i = 0; 
while (i < 1) { 
    try { 
     int level = scan.nextInt(); 
     i+=1; 
     if (level == 1) { 
      System.out.println("You selected level 1!"); 
      //Start the game 
     } else if (level == 2) { 
      System.out.println("You selected level 2!"); 
      //Start the game 
     } else if (level == 3) { 
      System.out.println("You selected level 3!"); 
      //Start the game 
     } else { 
      System.out.println("That's not an option!"); 
      i-=1; 
     } 
    } catch(InputMismatchException input) { 
     System.out.println("That's not an option!"); 
     i-=1; 
    } 
} 
+0

당신이 내가 사용자가 1-3 사이에 유효한 입력에 입력되었는지 확인하는 방법이 필요하지만 그들이 할 수있는 능력이 없다면 유효한 입력을 재 입력 – Dici

+0

을 달성하기 위해 원하는 것을 명확하지 않다. –

+0

내 대답을 참조하십시오, 나는 코드가 인수 분해되고 루프의 종료 조건이 명확 해 지므로 현재의 대답보다 낫다고 생각합니다. – Dici

답변

2

잘못된 입력을 입력하면이를 지워야합니다. 입력 예외가 너무 next() 그것을 취소하기로 트리거 될 때 scan.next()을 추가

catch(InputMismatchException input) { 
     System.out.println("That's not an option!"); 
     scan.next(); 
     i-=1; 
    } 
+0

정확히 내가 무엇을 고마워 할 필요가 있었 는가 –

+0

숫자가 1-3이 아닌 정수를 입력하면 else가 그 것이다. –

+0

@ BlueMoon 아니, 그렇지 않을 것이다. 예를 들어, '4'를 입력해도 무효 입력이라 할지라도 아무 예외도 발생시키지 않습니다 (자신이 던지지 않는 한). – Dici

0

예상치 못한 답변이지만 리팩터링이 코드는 아닙니다. Java의 기본 기능을 기억하십시오. 모든 기능 비트에는 자체 메서드가 있습니다. 다음

int readInput() { 
    // your code here, returning either the level or -1 on bad input 
} 

그리고 당신의 읽기 for 루프를 호출하지 : 그래서 입력을 읽고, 선택한 수준을 반환하는 방법을 사용 (아무것도 경우 또는 -1)

int selected; 
do { 
    selected = readInput(); 
} while(selected < 1); 
0

당신은 더 나을 작성 이 같은 코드 :

while(true){ 
    try{ 
     int level = scan.nextInt(); 
     if(level==1){ 
      System.out.println("You selected level 1!"); 
      break; 
     }else if(level==2){ 
      System.out.println("You selected level 2!"); 
      break; 
     }else if(level==3){ 
      System.out.println("You selected level 3!"); 
      break; 
     }else{ 
      System.out.println("That's not an option!"); 
      continue; 
     } 
    }catch(InputMismatchException input){ 
     System.out.println("That's not an option!"); 
     continue; 
    } 
} 

continue 바로 위쪽에있는 루프의 실행을 재개하며, break 즉시 너무 닫는 중괄호를 이동합니다 } 동안. 이렇게하면 카운터 변수 인 i이 사용되지 않아 코드에서 전혀 쓸모가 없습니다. 또한 사용자가 무기한으로 부적절한 값을 입력하지 않는 한이 코드는 절대 무기한으로 실행되지 않습니다!

희망이 도움이되었습니다. 행운을 빈다.

0

당신은 훨씬 간단한 방법으로 진행할 수 있습니다. 3 가지 유효 사례는 매우 유사하며 하나의 것으로 간주 될 수 있습니다. 루프가 종료되면 게임은 한 번만 시작될 수 있습니다. 왜냐하면 루프가 종료되면 level에 유효한 값이 있음을 알기 때문입니다.

boolean valid = false; 
int level; 
do { 
    try { 
     level = scan.nextInt(); 
     valid = 1 <= level && level <= 3; 

     if (valid) { 
      System.out.println(String.format("You selected level %d !",level));  
     } else { 
      System.out.println("That's not an option!"); 
     } 
    } catch(InputMismatchException input) { 
     scan.next(); 
     System.out.println("That's not an option!"); 
    } 
} while (!valid); 

// start the game