无法捕获NullReferenceException

时间:2012-12-05 14:38:28

标签: c# exception-handling

首先在这里发帖,很抱歉,如果我有一些错误的细节。我正在尝试捕获用户输入无效(不存在)员工的异常。我尝试了很多不同的变体,但错误从未引发过。相反,代码只是终止,在这种情况下,它将在以下行后退出:

 MyPostSalary = Convert.ToDouble(Console.ReadLine());
 Console.WriteLine();

谁能看到我做错了什么?

完整代码:

       Console.Write("Employee ID: ");
        myEID = Console.ReadLine();

        try
        {
            Console.Write("Post ID: ");
            myPID = Console.ReadLine();

            if ((myEmployees[myEID] is MonthlyPaidEmployee) || (myEmployees[myEID] isWeeklyPaidEmployee))
            {

                Console.Write("Post Name: ");
                MyPostName = Console.ReadLine();
                Console.Write("Post Start Date: ");
                MyPostStartDate = Convert.ToDateTime(Console.ReadLine());
                Console.Write("Post End Date: ");
                MyPostEndDate = Convert.ToDateTime(Console.ReadLine());
                Console.Write("Post Salary: ");
                MyPostSalary = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine();

                myPost = new Post(myPID, MyPostName, MyPostStartDate, MyPostEndDate, MyPostSalary);

                if (myEmployees[myEID] is MonthlyPaidEmployee)
                {
                    myMonthlyEmp = (MonthlyPaidEmployee)myEmployees[myEID];
                    myMonthlyEmp.PostHistory.Add(myPID, myPost);
                }

                if (myEmployees[myEID] is WeeklyPaidEmployee)
                {
                    myWeeklyEmp = (WeeklyPaidEmployee)myEmployees[myEID];
                    myWeeklyEmp.WeeklyPaidEmployeePostHistory.Add(myPID, myPost);
                }

            }

        }
        catch (NullReferenceException ex)
        {

            Console.WriteLine("Employee ID does not exist.");
            Console.WriteLine(ex.Message);
            Console.WriteLine();
            Console.WriteLine("Press any key to continue");
            Console.ReadLine();

        }

5 个答案:

答案 0 :(得分:3)

您只捕获NullReferenceException异常,但正如您在Convert.ToDouble()的方法说明中所看到的那样,它会抛出 InvalidCastException

请改为尝试catch (InvalidCastException ex)

另请注意FormatExceptionOverflowException

答案 1 :(得分:1)

很明显,你得到NullReferenceException。我建议您尝试以下操作:

catch (Exception ex)
{
        Console.WriteLine(ex.ToString());
        Console.WriteLine();
        Console.WriteLine("Press any key to continue");
        Console.ReadLine();        
}

找出您正在接收的异常,并捕获特定的异常,否则首先阻止它发生。

你应该从不捕获NullReferenceException。

答案 2 :(得分:0)

您是否收到双转换异常?您应该使用Double.TryConvert而不是Convert。

答案 3 :(得分:0)

看起来输入的文字无法转换为双倍。

尝试捕获InvalidCastException

答案 4 :(得分:0)

您是否在Visual Studio(或您的IDE)上进行调试? 如果是,可能是您正在捕获异常,但IDE设置为在异常引发时显示警告消息... 尝试在IDE外运行您的应用程序,如果它可以工作,您可以在NullReferenceExceptions引发时禁用警告,但这是非常危险的。为此,请查找"例外设置"在Visual Studio中(或类似的东西,我不确定,因为我使用意大利语版本)。