2017-09-22 2 views
0

이 코드는 사용자 입력을 요구합니다.시도하십시오. 캐치가 올바른 값을 반환 할 수 없습니다.

사용자가 잘못된 입력을 보내고 아래의 예외가 발생하면 사용자에게 다시 시도하게합니다.

예외가 발생한 후 getInputNumber()가 트리거되고 사용자가 숫자로 올바른 입력을 입력하면 올바른 숫자를 반환하는 반환이 트리거됩니다. 이 복귀 후

, 그것은 FormatException을 따라서 올바른 숫자 값을 삭제하고 나는 그것이 올바른 값을 얻기 위해 수정뿐만 아니라, 그 경우에 사용자가 다시 시도 할 수 있도록 유지할 수있는 방법 만 0

반환에 반환 정확한 입력을 놓친다 고요?

private static int getInputNumber() 
     { 
     int number = 0; 

     try 
     { 
      number = Convert.ToInt32(Console.ReadLine()); 

     } 
     catch (Exception ex) 
     { 
      if (ex is FormatException) 
      { 
       Console.Clear(); 
       Console.WriteLine("Wrong format! \nTry numbers instead."); 

       getInputNumber(); 

      } 
      else if (ex is OverflowException) 
      { 
       Console.Clear(); 
       Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647"); 
       getInputNumber(); 

      } 
     } 


     return number; 
    } 
+0

누가'getInputNumber' 메소드를 호출합니까? 정확히 무슨 일이 일어나는지 알아 내기 위해 코드를 디버깅 했습니까? –

+0

catch 블록에'number = getInputNumber();'라고 써야합니다. –

+0

좋아요! @ChetanRanpariya, 당신은 내가 의도 한 것처럼 그것을 고쳐 준 답을합니다. – jon

답변

1

: 대신 그냥 전화의

... 
if (ex is FormatException) 
{ 
    Console.Clear(); 
    Console.WriteLine("Wrong format! \nTry numbers instead."); 

    return getInputNumber(); 

} 
.... 

를 최종 결과는 다음과 같이 표시됩니다. 첫 번째 catch 후에 getInputNumber() 메서드를 호출하면 성공한 것으로 전달되고 catch 블록으로 돌아옵니다 (이 시점에서 예외가 발생하여이 숫자는 여전히 0입니다)

stybl이 말한 것처럼 boolean check 및 while 루프를 사용하여 유효한 입력 사용자를 계속 요청하십시오.

1

우선 Int32.Parse을 사용하는 것이 좋습니다. 이 특별한 경우에는 별다른 차이가 없지만 모범 사례로 간주됩니다.

private static int getInputNumber() 
{ 
    int number = 0; 

    try 
    { 
     number = int.Parse(Console.ReadLine()); 
    } 
    catch (Exception ex) 
    { 
     if (ex is FormatException) 
     { 
      Console.Clear(); 
      Console.WriteLine("Wrong format! \nTry numbers instead."); 
      return getInputNumber(); 

     } 
     else if (ex is OverflowException) 
     { 
      Console.Clear(); 
      Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647"); 
      return getInputNumber(); 

     } 
    } 

    return number; 
} 

그러나

는, 그런 getInputNumber 같이 Recurse 나쁜 생각입니다 제작 : 코드가 작동하려면 당신은 getInputNumber의 모든 재귀 호출에 대한 return 문을 포함해야합니다. 대신 무한 루프를 사용해야합니다. 이 시도 당신의 catch 블록에

private static int getInputNumber() 
{ 
    int number = 0; 
    while (true) 
    { 
     try 
     { 
      number = int.Parse(Console.ReadLine()); 
      break; 
     } 
     catch (Exception ex) 
     { 
      if (ex is FormatException) 
      { 
       Console.Clear(); 
       Console.WriteLine("Wrong format! \nTry numbers instead."); 

      } 
      else if (ex is OverflowException) 
      { 
       Console.Clear(); 
       Console.WriteLine("The number you entered is too large.\nTry a number between 1 and 2,147,483,647"); 
      } 
      else 
      { 
       Console.Clear(); 
       Console.WriteLine("Unexpected error!"); 
      } 
     } 
    } 

    return number; 
} 
+0

당신의 답은 @stybl도 잘 맞았지만 실수를하지 않았다면 의도 한대로 작동하도록 부울 변수를 넣어야했습니다. 그러나, 그것은 또한 효과가 있었다. 감사합니다 – jon

+0

@jon 기꺼이 도와 드릴 수 있습니다. 문제가 해결 되었다면 답을 [수락] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)으로 표시하십시오. – stybl

관련 문제