【问题标题】:Null Exception handling in foreach loopforeach 循环中的空异常处理
【发布时间】:2011-10-19 17:26:24
【问题描述】:

我的列表 X 带有一些字符串和空值。我正在迭代 foreach 循环以将值绑定到文本框。如果我在列表 X 中得到任何空值,foreach 循环将终止并获取空异常如何处理它。

我正在检查 for each 循环中的条件。但我认为它在逻辑上不正确。

SPList _listObj = web.Lists[new Guid(listID)];
            SPListItem item = _listObj.GetItemById(Convert.ToInt32(itemID));
           foreach (SPField field in _listObj.Fields)
            {
                if (field.Title != Null)
                {  //do some code}}

【问题讨论】:

  • 你能说得更准确点吗...您提供的代码不是有效的 C# 代码...我不明白出了什么问题
  • 请粘贴确切的异常消息,只是说“我得到一个异常”是不够的信息。
  • 是的 x 为 null 如何处理它。
  • 上面的代码最后两个括号被注释掉了。显然不应该是这样,否则它不会编译。不过,我们只是假设您不想粘贴不相关的内容,并且知道这一点。

标签: c# exception-handling null foreach


【解决方案1】:

试试下面的代码:

foreach(var x in Lists.Where(x => x.fiels != null))
{

}

【讨论】:

    【解决方案2】:

    我觉得这段代码很可疑。

    首先,你真的有一个列表列表吗?如果是这样,我想您还必须遍历内部列表中的每个元素:

    foreach(List list in Lists)
    {
        foreach (var x in list)
        {
            if (x.fields != null)
                // blah
            else
                // blah
        }
    }
    

    其次,您确定Lists 变量不包含任何空值吗?可能实际上是 x 为空,这就是您的空引用异常的原因:

    foreach(List x in Lists)
    {
        if (x != null && x.fields != null)
            // blah
        else
            // blah
    }
    

    【讨论】:

      【解决方案3】:

      提供的代码不正确。我想您想在 foreach 循环中检查 X 是否为 Null。如果这在逻辑上正确与否,那么只有您可能知道,因为逻辑超出了提供的代码并取决于您实际使用它的位置。

      我个人认为在 foreach 循环中检查空值并没有什么不好的。

      例如,您还可以使用 Linq 先查询 Null 值,然后再查询 Non Null 值。设计选择的问题。

      问候。

      【讨论】:

        【解决方案4】:

        在列表中列出 x?你可能打算这样做:

        foreach(string x in listvar){
            if(x != null)
               // do something
        }
        

        字符串实际上是空的还是空的?那是有区别的。

        foreach(string x in listvar){
            if(x != "")
               // do something
        }
        

        我怀疑问题在于您对 foreach 循环的错误实现,这会导致弹出 null 错误,因为循环内的对象不存在。

        【讨论】:

          【解决方案5】:

          为什么不将它与 null-coalescing 运算符一起使用

             foreach (var item in feeList ?? new List<FeeBusiness>())
             {
                     // your code
             }
          

          ??运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。

          【讨论】:

            【解决方案6】:
            string delimitedvalues = null;//"11,22,33";
            foreach(var str in (delimitedvalues?? string.Empty).split(','))
            {
                string testvalue = "Test Value" + str;
            }
            

            希望上面的构造有用!

            【讨论】:

              【解决方案7】:

              在迭代其字段之前,您必须确保您获得的对象不会返回为 null(您的列表,_listObj)。即使您确定您传入的 GUID 与您尝试获取的列表匹配,您也应该检查该对象是否为空,并检查字段数,以及是否获得您正在传递的 ID 的项目在:

              SPList _listObj = web.Lists[new Guid(listID)];
              if (_listObj != null)  // do we have a list object?
              {
                  if (_listObj.Fields.Count > 0) // do we have list columns on the list?
                  {
                      SPListItem item = _listObj.GetItemById(Convert.ToInt32(itemID));
                      if (item != null) // did our item ID get a hit?
                      {
                          foreach (SPField field in _listObj.Fields)
                          {
                              if (field.Title != null)  // need lower case null, here
                              {  
                                  //do some code
                              }
                          }
                      }
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-11-13
                • 1970-01-01
                相关资源
                最近更新 更多