[英]Handling a null exception C#
好的,新的编码器在这里寻找对这个问题的一点了解。 所以我有一个像这样开始的for循环:
for (int i = 0; i < rowHandles.Length; i++)
{
.........code....
}
rowHandles是一个包含数据行的int数组。 此for循环具有在单击删除按钮时删除数据行的代码,具体来说,它是网格工具条删除按钮,这是在删除按钮单击事件处理程序内。 问题是当没有行时可以单击删除按钮,因此rowHandles.Length等于null。 我该如何阻止这个程序停止? 我可以在for循环中,在for循环声明中,还是在for循环之外添加一些内容来纠正这个问题? 也许尝试抓住? 如何围绕这个特定的问题/循环进行构建?
感谢您的帮助 - 新手编码器
如果问题是rowHandles
可以为null
那么只需添加一个显式检查,以防止您执行for
语句。
if ( rowHandles != null ) {
for ( int i = 0; i < rowHandles.Length; i++ ) {
...
}
}
如果没有要删除的行,另一个选项是完全禁用删除按钮。 操作无效,因此从一开始就阻止它。
这里的一个重要原则是永远不会处理您可能首先要阻止的异常 。 你永远不应该处理空引用异常; null引用异常表示程序中应该修复的错误,而不是应该被捕获和忽略的预期发生。 编写代码以确保该值不为null,或者检测它是否为null并且不取消引用它。
问题是当没有行时可以单击删除按钮,因此rowHandles.Length等于null。
这是错的。 当有0个元素时,Length设置为0.什么是null可能是rowHandles。 你需要在进入循环之前处理这个条件。
它不是 rowHandles.Length
,它是null,它是rowHandles
本身。
一个常见的解决方案是:
if (rowHandles != null)
//Your loop here
如果没有剩下的行,则rowHandles.Length将为零而不为null。 如果你在循环之后摆脱rowHandles,那么你可以这样做:
if (rowHandles != null)
{
for (int i = 0; i < rowHandles.Length; i++)
{
// Code
}
}
无需异常处理。 另一方面,如果你在该循环运行时允许rowHandles被其他东西改变,那就是另一个故事。
看起来长度不是空的瘦。 而是rowHandles为null,并且在尝试访问Length属性时获得null异常。
if(rowHandles != null)
{
//for loop
}
我建议你尽可能地坚持单一责任原则 ,因为你让代码按照预期的方式行事,并在其他地方处理错误。
我认为rowHandles
在其他地方使用是有意义的,所以你应该集中检查它是否为null
。
如果您仍然选择在您引用的代码体中处理它,则任何建议的解决方案都可以使用。
更改为foreach
循环:
foreach (var rowHandle in rowHandles)
{
// use rowHandle instead of rowHandles[i]
}
这样,如果整个rowHandles对象不为null(快速null检查可以验证这一点),您将迭代所有项目,如果没有项目,则根本不会迭代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.