我在使用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中的脚本组件。
谢谢
答案 0 :(得分:8)
try
块可能永远不会为ro
分配值,因此将在try块之外未分配值。要解决此问题,请分配一个值:
RootObject ro = null;
由于ro
可能是null
,因此在尝试访问成员之前,需要在if
语句中进行检查:
if (ro != null && ro.Region != null)
{
Row.Region = ro.Region;
Row.SubRegion = ro.Subregion;
}
答案 1 :(得分:6)
赋予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;
}
答案 2 :(得分:4)
对象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;
}
答案 3 :(得分:3)
用ro
初始化RootObject ro = null;
并将if语句更改为
if (ro?.Region != null)
{
Row.Region = ro.Region;
Row.SubRegion = ro.Subregion;
}
这样,语句将检查ro为null或ro.Region为null