如何处理可能返回null并生成System.NullReferenceException的方法

本文关键字:System NullReferenceException 方法 null 返回 何处理 处理 | 更新日期: 2023-09-27 18:18:36

我有一个返回类型为Fruit的方法,它执行以下操作:

Search for the right apple, if it matches return it; else
Search for the right banana, if it matches return it; else
Search for the right orange, if it matches return it; else
return null

Fruit是一个具有以下内容的接口:

bool Rotten { get; set; }

问题是当我尝试使用它时:

store.GeTAFruit("magic apple").Rotten;

如果它没有找到水果,它将返回null,这将给出一个NullReferenceException

当然,我可以用try catch包围它,但这意味着每次使用这个函数时,我都必须用try catch包围它,这似乎根本不是一个好主意。

我正在寻找一个解决这个问题的方法,或者更确切地说,什么是最好的方法。

如何处理可能返回null并生成System.NullReferenceException的方法

如果GetAFruit可以返回null,那么(这里是技术位):检查null:

var fruit = store.GetAFruit(...);
if(fruit != null) {
    //... Do stuff
}

检查store.GeTAFruit("magic apple")是否为空:

   if (store.GeTAFruit("magic apple") != null) {
   }

如果您不想使用异常处理,有两种方法。但它们的本质是一样的。在使用查找结果之前,必须计算查找结果以测试它是否为空。

第一个选项是将查找结果赋值给一个变量,然后在使用它之前进行测试。

Fruit fruit = store.GeTAFruit("magic apple");
if(fruit != null)
{
    //safely use your Rotten property
    bool lFlag = fruit.Rotten;
}

另一种方法是这样测试…

if(store.GeTAFruit("magic apple") != null)
{
    store.GetTAFruit("magic apple").Rotten;
}
第一种方法的优点是只需执行一次查找。

这可能有帮助

if (store.GeTAFruit("magic apple")!=null) {
store.GeTAFruit("magic apple").Rotten;
} 

编辑使其更有效:

var fruit = store.GeTAFruit("magic apple");
if (fruit!=null)) {
    fruit.Rotten;
} 

定义一个NullFruit: IFruit。