2017-09-22 5 views
0

このコードは、ユーザーからの入力を受け付けます。試してください。キャッチは正しい値を返すことができません。

誤った入力を送信した後でユーザーに再試行させ、以下の例外をトリガーしたいと考えています。

例外の後にgetInputNumber()がトリガされ、ユーザーが数字として正しい入力を入力すると、正しい番号を返す戻り値がトリガされます。この戻りの後、それはこのように私はそれが正しい値を取得するために修正するだけでなく、彼ならば、ユーザは再度お試しできるように維持することができますどのように正しい数の値を削除し、のみ0

を返すFormatExceptionに戻り

正しい入力を逃した?

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

:最終的な結果は次のようになります。これは、最初のキャッチ後にgetInputNumber()メソッドを呼び出すと成功した場合はキャッチブロックに戻ります(この時点で例外が発生してから0になっています)

styblは言ったようにboolean checkとwhileループを使用して、有効な入力ユーザーを要求し続けます。

1

まず、Int32.Parseを使用することをお勧めします。この特定のケースでは大きな違いはありませんが、ベストプラクティスとみなされます。しかし、それは悪い考えであるようgetInputNumber再帰を作る

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のすべての再帰呼び出しのためのreturnステートメントを含める必要があります。代わりに、無限ループを使用する必要があります。

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

    return getInputNumber(); 

} 
.... 

だけではなく、それを呼び出す:これを試してみてください、あなたの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

関連する問題