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

Posted

技术标签:

【中文标题】如何处理可能返回 null 并生成 System.NullReferenceException 的方法【英文标题】:How to handle a method that might return null and generate a System.NullReferenceException 【发布时间】:2013-06-11 22:33:14 【问题描述】:

我有一个返回类型为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 包围它,这似乎根本不是一个好主意。

我正在寻找解决此问题的方法,或者更确切地说,这是解决此问题的最佳方法。

【问题讨论】:

现在你想在调用 "store.GeTAFruit("magic apple").Rotten" 时发生什么? 【参考方案1】:

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

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

【讨论】:

谢谢马克,我的问题是即使这样,我想知道它将来可能会带来什么问题。该函数在大多数情况下都可以使用,所以我担心有人重用它可能会在没有 if/try 的情况下使用它并看到“它有效”,但也许这是一个没有真正解决方案的问题,除了记录函数并警告使用它的开发人员。 @Trufa 你可以让 API 更明显,那么;将其命名为 TryGetAFruit 可能就足够了。让它在失败时抛出异常(可能是KeyNotFoundExceptionArgumentException)会让人无法忽视——虽然我个人会很好地返回null【参考方案2】:

只需检查store.GeTAFruit("magic apple") 不为空:

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

   

【讨论】:

【参考方案3】:

如果您不想使用异常处理,有两种方法。但它们的本质是一样的。在使用它之前,您必须评估查找结果以测试它是否为 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;

第一种方法的好处是您只需执行一次查找。

【讨论】:

【参考方案4】:

这可能会有所帮助

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

编辑让它更高效一点:

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

【讨论】:

真的吗?调用 .Equals 来查看它是否为空?这真的不是什么好举动!在除 Nullable-of-T 之外的所有情况下,如果它为 null,则保证为 null 引用异常 为什么?我将苹果放入变量但没有考虑.Equals() @DaveDev 你不应该考虑 .Equals 这个 - 它不会工作 @MarcGravell thanx 进行更正,你是对的,它的保证空引用异常,编辑它。 “效率更高一点”?您无法知道 GeTAFruit 方法的执行情况,因此效率提升可能是巨大的。【参考方案5】:

定义一个 NullFruit : IFruit。如果没有找到,则返回它的一个实例。

【讨论】:

以上是关于如何处理可能返回 null 并生成 System.NullReferenceException 的方法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL NULL 值如何处理?

如何处理将 DBNull 传递给函数?

前台如何处理后台返回的json数据

MySQL从入门到精通50讲-MySQL中null值如何处理

如何处理 ArgumentOutOfRangeException [重复]

服务器返回<null>值 iOS 端如何处理