2017-02-16 7 views
1

알고리즘은 ArrayList에 3 개의 정수를 사용해야합니다. 입력이 정수가 아니면 프롬프트가 있어야합니다. 코드를 실행하면 catch 절이 실행되지만 프로그램은 무한 루프로 실행됩니다. 누군가 나를 올바른 방향으로 안내 할 수 있었는지, 도움을 주셔서 감사합니다. - DJava에서 do-while 루프를 사용한 예외 처리

package chapter_08; 
import java.util.Scanner; 
import java.util.List; 
import java.util.ArrayList; 

public class IntegerList { 
    static List<Integer> numbers = new ArrayList<Integer>(); 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int counter = 1; 
     int inputNum; 

     do { 
      System.out.print("Type " + counter + " integer: "); 
      try { 
       inputNum = input.nextInt(); 
       numbers.add(inputNum); 
       counter += 1; 
      } 
      catch (Exception exc) { 
       System.out.println("invalid number"); 
      } 
     } while (!(numbers.size() == 3)); 
    } 
} 

답변

3

그 이유는 다음 int가 nextInt()을 사용하여 읽히고 실패 할 경우 Scanner에 여전히 입력 된 내용이 포함되어 있기 때문입니다. 그런 다음 do-while 루프를 다시 입력하면 input.nextInt()은 동일한 내용으로 다시 구문 분석을 시도합니다.

당신은 nextLine()로에 '높이'를 Scanner 내용을 필요

catch (Exception exc) { 
    input.nextLine(); 
    System.out.println("invalid number"); 
} 

참고 :

  • 당신은 counter 변수를 제거 할 수 있습니다, 당신이 그것을 사용하지 않는 때문에 . 그렇지 않은 경우 counter += 1counter++으로 바꿀 수 있습니다.
  • while (!(numbers.size() == 3))while (numbers.size() != 3) 또는 더 나은 것으로 바꿀 수 있습니다. while (numbers.size() < 3).
  • 예외를 잡을 때는 매우 구체적인 이유가없는 한 가능한 한 구체적이어야합니다. 귀하의 경우 ExceptionInputMismatchException으로 대체되어야합니다.
0

당신이해야 지금처럼 catch(){}break;를 사용 : 하나 개의 입력이 루프를 중단 수정되지

try { 
    inputNum = input.nextInt(); 
    numbers.add(inputNum); 
    counter += 1; 
} catch (Exception e) { 
    System.out.println("invalid number "); 
    break; 
} 

그래서 경우.

1

inputNum = input.nextInt();을 int에 넣을 수없고 InputMismatchException이 발생하면 Scanner의 입력이 소비되지 않습니다.

그래서 캐치 후에는 루프 그리고 다시 간다 :

inputNum = input.nextInt(); 

를 입력 정확히 동일한 내용으로.

catch 문에서 input.nextLine();을 실행하여 현재 입력을 무시하고 사용자가 새 입력을 허용해야합니다.
가 발생할 수있는 불일치와 관계 없음 다른 예외로 InputMismatchException보다는 Exception을 잡기 위해 더 의미 외에 그리고 그것은 문제가되지 않는 경우는 사용자 "invalid number "에 표시 할 유용하지 않을 것입니다 :

catch (InputMismatchException e){ 
     System.out.println("invalid number "); 
     input.nextLine(); 
    } 
0

시도가 완벽하게 잘 작동

inputNum = input.nextInt(); 

String inputText=input.next(); 
inputNum = Integer.valueOf(inputText); 

에 변경.

0

스캐너를 다음 줄로 이동해야합니다. catch 섹션의 오류 메시지 아래에이 코드 줄을 추가하십시오.

input.nextLine();