2017-09-22 130 views
0

此代碼需要用戶輸入。嘗試,Catch無法返回正確的值

我希望用戶在發送錯誤的輸入並觸發下面的任何例外之後再試一次。

在異常發生後觸發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

在你的catch塊試試這個:

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

    return getInputNumber(); 

} 
.... 

而不是僅僅調用它。這是因爲當你在第一次捕獲之後調用getInputNumber()方法並且它通過成功時,它會回到你的catch塊(在這一點上,因爲異常發生,這個數字仍然是0)

正如stybl所說,使用布爾檢查和while循環來繼續詢問有效的輸入用戶。

1

首先,我推薦使用Int32.Parse來代替。在這種特殊情況下,它不會有太大的區別,但它被認爲是最佳做法。爲您的代碼工作,你需要包括的getInputNumber每一個遞歸調用return聲明:

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遞歸一樣,是一個壞主意。相反,你應該使用無限循環。最終的結果將是這個樣子:

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