如何处理可能返回 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
可能就足够了。让它在失败时抛出异常(可能是KeyNotFoundException
或ArgumentException
)会让人无法忽视——虽然我个人会很好地返回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从入门到精通50讲-MySQL中null值如何处理