5

사용자 입력 값을 검색하는 코드를 실행하려고합니다. 이 액션은 내가 작성한 커스텀 메소드 인 getTriangleDim()에 포함되어있다. 이 메소드는 사용자 int 값을 읽고 특정 범위 내에 있는지 확인한 다음 입력 된 int 값을 리턴합니다. 이 방법은 훌륭하게 작동하며 문제가 없습니다.Java : Do-While 루프 내에서 Try-Catch 문을 사용합니다.

내 getTriangleDim() 메소드에 int가 아닌 값을 입력하면 문제가 발생합니다. InputMismatchException 오류가 발생합니다. 이 문제를 해결하기 위해 do-while 루프에 try-catch 문을 작성했습니다. 그러나 이것은 try-catch 문을 사용한 적이 처음이며, 나는 분명히 뭔가를 놓치고 있습니다.

//loop to scan for triangle dimension 
     boolean bError = true; 
     int triangle; 

     do{ 
      try { 
       triangle = getTriangleDim(); 
       bError=false; 
       } 
      catch (Exception e){ 
       System.out.println("You did not enter an integer, please enter an integer value"); 
       triangle = getTriangleDim(); 

       } 
     }while (bError); 

내가 INT 대신에 char 값을 입력하여 테스트하는 경우는, 실제로 오류를 한 번에 잡는다 : 여기

는 DO-while 루프 내에서 중첩 된 시도-catch 문에 대한 코드입니다 , 그리고 나서 "당신은 ....."진술을 인쇄합니다. 그러나 다른 비 int가 아닌 숫자를 다시 입력하면 다시 런타임 오류가 발생합니다 ....... 추측 ........ InputMismatchException 오류가 발생했습니다.

내 방법에 대한 코드는 여기에 있습니다 :

//method for scanning triangle dimensions from keyboard 
    public static int getTriangleDim(){ 
     int triangle = 0; 
     Scanner keyboard = new Scanner(System.in); 
     do{ 
     System.out.print("Enter a non-zero integer length (+/-1 - +/-16): "); 
     triangle = keyboard.nextInt(); 
     if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1))) 
      System.out.println("Inpute value outside of range"); 
     }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1))); 
     return triangle; 
    } 

내가 필요로하는 마 - 동안 루프가 계속하려면,하지만 난이 오류가 계속.

+0

새로운 예외 '클래스 NotIntegerException을 정의하고 예외 {..}를 확장하여 외부에 잡아 다른 유형의 예외와 구별 할 수 있습니다. –

답변

2

catch 블록에 입력을 요청할 필요가 없습니다. 이미 반복문을 사용하고 있으므로 예외를 잡을 수 있고 사용자에게 유효한 입력을 제공하도록 말할 수 있습니다. 그런 다음 다른 작업을 수행 할 필요가 없습니다. 처음부터 다시 돌아갈 것입니다. 보조 노트 (당신이 나타났습니다로하고) 그 try 블록의 triangle 외부를 사용하려고하면, 코드가 현재 "triangle might not have been initialized" 때문에, 컴파일되지 않습니다으로


do{ 
    try { 
     triangle = getTriangleDim(); 
     bError=false; 
    } catch (Exception e){ 
     System.out.println("You did not enter an integer, please enter an integer value"); 
     // Don't do anything else in here: we will loop back to the beginning again and get new input! 
    } 
}while (bError); 

. 이는 컴파일러 cannot determine at compile-time what your program will do at run-time 즉, 컴파일러가 항상 해당 루프 내에서 triangle이 초기화된다는 사실을 알 수 없기 때문입니다. 따라서 변수 선언은 을 기본값으로 설정해야합니다. 0int의 기본 기본값이지만 프로그램에서 의미가있는대로 사용하십시오 ( getTriangleDim 코드를 기반으로하면 0이 정상입니다). triangle 당신이 루프를 떠날 시간을 기준으로 값을 갖게됩니다, 당신은 다른 곳에서 사용할 수 있습니다 당신이 할 수있는 "약속"컴파일러

int triangle = 0; 
do { // etc. 

이 방법.

+0

감사합니다. 지금 바보가됩니다. catch 블록에서 스캐너 입력을 제거하도록 코드를 업데이트했습니다. 하지만 이제 다른 오류가 발생했습니다. 컴파일러에서 다음과 같은 오류가 발생합니다. "호환되지 않는 소스 코드 - 변수 삼각형이 초기화되지 않았을 수 있습니다." 또한 Do-while 루프와 중첩 된 try-catch 문 다음에 traingle 변수에 대한 모든 참조는 빨간색 밑줄이 그어져 있습니다. 이해가 안됩니다. 마치 내 프로그램이 값으로 초기화되었다는 것을 인식하지 못하는 것 같습니다. – FluffyKittens

+1

@ Adam 컴파일러는 거짓말하지 않습니다! * 루프를 종료 할 때 초기화되어야하지만 컴파일러는 프로그램 실행 방법을 예측할 수 없다는 것을 알 수 있습니다 (http://en.wikipedia.org/wiki/Halting_problem). * 컴파일러에 관한 한,'triangle'을 초기화하지 않고 루프를 빠져 나갈 수 있습니다.비슷한 예제를 보려면 [이 질문 (http://stackoverflow.com/q/14790940/2069350)을 참조하십시오.] 요점은'triangle'을 어떤 기본값 ('0'과'-1 ')으로 초기화해야한다는 것입니다 ')는 실제 할당을 수행하기 전의 루프 (예 :'int triangle = 0;')입니다. –

+0

Thnaks! 도움에 감사드립니다. – FluffyKittens

관련 문제