2013-02-18 91 views
0

堆棧溢出社區。控制檯應用程序崩潰/未響應

我正在寫一個程序,將華氏溫度轉化爲攝氏溫度和攝氏華氏溫度。該程序有一個簡單的菜單,並獲取用戶輸入來選擇一個選項。如果用戶輸入無效選項,我實現了一個小小的do-while循環。如果用戶選擇1,2或3(這是三個有效的選項),程序將運行if語句,在其中執行塊代碼並打破循環。但是,如果用戶輸入了其他內容(一個無效的選項),程序將在else中執行塊代碼,然後它將返回到循環的開始處(選擇一個選項),從而凍結或崩潰。

下面是代碼:

// James Archbold 
// Convert.cs 
// A program to convert fahrenheit to celsius or celsius to fahrenheit 
//16 February 2013 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Convert_Temperature 
{ 
class Convert 
{ 
    static void Main(string[] args) 
    { 
     float F, C; 
     string option; 

     do 
     { 
      Console.WriteLine("\nWelcome to 'Convert' program!"); 
      Console.WriteLine("***********************Menu**********************************"); 
      Console.WriteLine("1. Fahrenheit to Celsius"); 
      Console.WriteLine("2. Celsius to Fahrenheit"); 
      Console.WriteLine("3. Goodbye"); 

      Console.Write("\nPlease enter an option: "); 
      option = Console.ReadLine(); 

      switch (option) 
      { 
       case "1": 
        Console.Write("Please enter your Fahrenheit temperature: "); 
        F = int.Parse(Console.ReadLine()); 
        C = (5f/9f) * (F - 32); 
        Console.WriteLine("The temperature is {0} degrees Celsius.", C); 
        Console.ReadKey(); 
        break; 


       case "2": 
        Console.Write("Please enter your Celsius temperature: "); 
        C = int.Parse(Console.ReadLine()); 

        F = 5f/9f * C - 32; 

        Console.WriteLine("The temperature is {0} degrees Fahrenheit.", F); 

        Console.ReadKey(); 
        break; 


       case "3": 
        Console.WriteLine("Goodbye!"); 
        Console.ReadKey(); 
        break; 


       default: 
        Console.WriteLine("That is not a valid option!"); 
        break; 
      } 

      Console.WriteLine("Please press Enter to continue..."); 
      Console.ReadLine(); 
      Console.WriteLine(); 

     } while (option != "3"); 

    } 

} 

}

+0

我不精通C#,但我希望你的程序與'int.Parse引發的異常死亡(到Console.ReadLine())'。那麼會發生什麼?崩潰或凍結?如果在調試器中逐步執行程序,會發生什麼情況? – Axel 2013-02-18 16:12:10

+0

當我在Visual C#express中運行程序時,它會凍結並將我拋回到我認爲是調試器的地方。另一方面,當我在Windows cmd中編譯程序時,程序將崩潰並拋出「未處理的異常」 – Jameslat 2013-02-18 16:20:07

+0

對於我來說,除了拋出的'FormatException'之外,程序對我來說很好。看第二個答案。 – jAC 2013-02-18 16:20:38

回答

3

你行,option = int.Parse(Console.ReadLine());,將拋出一個異常,如果輸入的文本無法解析。考慮使用TryParse方法來代替:

if (!int.TryParse(Console.ReadLine(), out option) { 
    option = -1; // Set option to represent an invalid option. 
} 
+0

我應該將變量賦值語句更改爲這個嗎? – Jameslat 2013-02-18 16:36:22

+1

通過這樣做,我得到了一個類似的結果來聲明變量爲int,在輸入任何不同於1,2或3的數字後,程序將顯示「請輸入一個選項:該選項無效」。 – Jameslat 2013-02-18 18:44:08

1

Jameslat - 正如FlsZen以上

評論曾建議更換

option = int.Parse(Console.ReadLine()); // Original code 

if (!int.TryParse(Console.ReadLine(), out option)) 
{ 
    option = -1; 
} 

使用的TryParse可以檢查如果操作成功或沒有通過檢查返回值是的布爾類型。錯誤的返回值表示解析失敗,在代碼片段中將值-1分配給名爲「option」的變量。

http://msdn.microsoft.com/en-us/library/system.int32.tryparse.aspx