C# 无法捕获NullReferenceException
第一篇文章在这里,如果我把一些细节弄错了,很抱歉。我试图捕获一个异常,其中用户输入了一个无效的不存在的雇员。我尝试过许多不同的变体,但从未出现过错误。相反,代码只是终止,在这种情况下,它将在以下行之后退出:C# 无法捕获NullReferenceException,c#,exception-handling,C#,Exception Handling,第一篇文章在这里,如果我把一些细节弄错了,很抱歉。我试图捕获一个异常,其中用户输入了一个无效的不存在的雇员。我尝试过许多不同的变体,但从未出现过错误。相反,代码只是终止,在这种情况下,它将在以下行之后退出: MyPostSalary = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(); 有人能看出我做错了什么吗 完整代码: Console.Write("Employee ID: "); myE
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();
}
您没有收到双重转换异常吗?您可能应该使用Double.TryConvert而不是Convert。看起来输入的文本无法转换为Double
尝试捕获InvalidCastException。您只捕获NullReferenceException异常,但正如您在的方法描述中所看到的,它会抛出InvalidCastException 因此,请尝试捕获InvalidCastException ex
还要注意FormatException和OverflowException。很明显,您没有得到NullReferenceException。我建议您尝试以下方法:
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.WriteLine();
Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
找出您正在接收的异常,要么捕获该特定异常,要么从一开始就阻止它发生
您永远不应该捕获NullReferenceException。您是在Visual Studio上调试还是在IDE上调试? 如果是,可能您正在捕获异常,但IDE设置为在异常引发时显示警告消息。。。
尝试在IDE之外运行您的应用程序,如果它有效,您可以在引发NullReferenceExceptions时禁用警告,但这是非常危险的。要执行此操作,请在Visual Studio或类似工具中查找异常设置,我不确定,因为我使用的是意大利版本。您的主要问题是您没有向我们显示您接收的异常或您接收异常的位置。@Daniel是对的,而且请不要捕获无效用户输入的异常。这是一个相当普遍的情况,绝对没有例外。让我们验证输入以拒绝它@约翰·桑德斯。我没有收到任何例外。代码只是终止。我希望它会发现我的employees集合中不存在员工ID。我尝试过调试器,但代码似乎从未达到捕获错误的程度。我应该说我对c相当陌生!听起来你是在发布模式下运行的-在调试中我想异常被捕获了?@Peopleware,我不认为它是重复的。他要求的恰恰相反,他抓不到例外。见下面我的答案。抓住将军几乎总是个坏主意exception@SamyS.Rathore字体我知道。这仅用于诊断目的。