【问题标题】:C# Checking if Object is NullC# 检查对象是否为空
【发布时间】:2019-02-15 14:48:06
【问题描述】:

我在使用 if 语句检查对象是否为空时遇到问题。

我有一个 webClient 在 try/catch 中从网站中提取 JSON 字符串。如果出错,那是因为 API 中不存在 3 位数的国家/地区,我只想跳过它。

这是我的代码:

    System.Net.WebClient wc = new System.Net.WebClient();

    RootObject ro;
    try
    {
        string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());

        JavaScriptSerializer js = new JavaScriptSerializer();

        ro = js.Deserialize<RootObject>(resp);
    }
    catch (Exception e)
    { }

    if (ro.Region != null)
    {
        Row.Region = ro.Region;
        Row.SubRegion = ro.Subregion;
    }

RootObject 是一个要反序列化的类。这很好用。

但是,我在 if 语句中收到一个错误,即“使用未分配的类 'ro'。

有人可以帮我解决这个问题吗? ro 在 if 中按预期工作?

我也试过检查一个特定的节点,但它仍然挂在“ro”部分。

另外,这是 SSIS 中的一个脚本组件。

谢谢

【问题讨论】:

  • 如果抛出错误并执行catch路径ro未初始化。这就是您收到此错误的原因。
  • 然后分配它。如果没有分配,你想让程序做什么?
  • 我希望它跳过并退出。如果API没有返回,基本上就完成了
  • 将 RootObject ro 更改为 RootObject ro = null;并将 ro.Region != null 更改为 ro?.Region != null
  • Murray 解决了它。我以为它一开始是空的

标签: c# ssis


【解决方案1】:
  1. try 块可能永远不会为ro 分配值,因此它将在 try 块之外未分配。要解决这个问题,请分配一个值:

    RootObject ro = null;
    
  2. 由于ro 可能是null,因此您需要在尝试访问成员之前在if 语句中进行检查:

    if (ro != null && ro.Region != null)
    {
        Row.Region = ro.Region;
        Row.SubRegion = ro.Subregion;
    }
    

【讨论】:

  • 谢谢。解决这个问题真的是#1。我还将 if 更改为 just if(ro!=null) 并取得了预期的结果。
【解决方案2】:

ro一个默认值,所以把RootObject ro改成RootObject ro = null;

并将ro.Region != null 更改为ro?.Region != null 以允许ro 为空。

并可能做一些处理该异常的事情。

System.Net.WebClient wc;

RootObject ro = null;
try
{
    wc = new System.Net.WebClient();
    string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());

    JavaScriptSerializer js = new JavaScriptSerializer();

    ro = js.Deserialize<RootObject>(resp);
}
catch (Exception e)
{
    // Log your error
}

if (ro?.Region != null)
{
    Row.Region = ro.Region;
    Row.SubRegion = ro.Subregion;
}

【讨论】:

    【解决方案3】:

    对象 ro 应该被初始化,因为它是在 try 范围之外被调用的

    RootObject ro = null;
    try
    {
        string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());
    
        JavaScriptSerializer js = new JavaScriptSerializer();
    
        ro = js.Deserialize<RootObject>(resp);
    }
    catch (Exception e)
    { }
    
    if (ro?.Region != null)
    {
        Row.Region = ro.Region;
        Row.SubRegion = ro.Subregion;
    }
    

    【讨论】:

      【解决方案4】:

      RootObject ro = null;初始化ro并将if语句更改为

      if (ro?.Region != null)
      {
          Row.Region = ro.Region;
          Row.SubRegion = ro.Subregion;
      }
      

      这样语句将检查 ro 是否为 null 或 ro.Region 是否为 null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 2014-01-01
        • 2017-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多