繁体   English   中英

处理空异常C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM