2013-02-18 110 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