为什么在某些语言中,尝试访问空值的属性会导致异常? [英] Why does trying to access a property of null cause an exception in some languages?
本文介绍了为什么在某些语言中,尝试访问空值的属性会导致异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
某些编程语言(例如C#、Java脚本)最困扰我的是,尝试访问null
的属性会导致出现错误或异常。
例如,在以下代码片段中,
foo = bar.baz;
如果bar是null
,C#将抛出一个令人讨厌的NullReferenceException
,而我的Java脚本解释器将抱怨Unable to get value of the property 'baz': object is null or undefined
。
理论上我可以理解这一点,但在实际代码中,我经常有一些深层次的对象,比如
foo.bar.baz.qux
如果foo
、bar
或baz
中的任何一个为空,则我的代码被破解。:(此外,如果我在控制台中计算以下表达式,似乎有不一致的结果:
true.toString() //evaluates to "true"
false.toString() //evaluates to "false"
null.toString() //should evaluate to "null", but interpreter spits in your face instead
我绝对鄙视编写代码来处理此问题,因为它总是冗长、难闻的代码。以下不是人为设计的示例,我是从我的一个项目(第一个是用Java脚本编写的,第二个是用C#编写的)中获取的:
if (!(solvedPuzzles &&
solvedPuzzles[difficulty] &&
solvedPuzzles[difficulty][index])) {
return undefined;
}
return solvedPuzzles[difficulty][index].star
和
if (context != null &&
context.Request != null &&
context.Request.Cookies != null &&
context.Request.Cookies["SessionID"] != null)
{
SessionID = context.Request.Cookies["SessionID"].Value;
}
else
{
SessionID = null;
}
如果任何一个属性为空,则整个表达式返回null
会容易得多。上面的代码示例本可以简单得多:
return solvedPuzzles[difficulty][index].star;
//Will return null if solvedPuzzles, difficulty, index, or star is null.
SessionID = context.Request.Cookies["SessionID"].Value;
//SessionID will be null if the context, Request, Cookies,
//Cookies["SessionID"], or Value is null.
我是否遗漏了什么?这些语言为什么不改用此行为?是不是因为某种原因很难实施?是否会导致我忽略的问题?
推荐答案
是否会导致我忽略的问题?
是-它会导致期望有非空值,但由于错误,您得到了空值的问题。在这种情况下,您需要一个例外。悄悄地失败并继续使用错误的数据是一个非常糟糕的想法。
一些语言(如Groovy)提供了一个空安全的取消引用操作符,这可能会有所帮助。在C#中,它可能类似于:
SessionID = context?.Request?.Cookies?["SessionID"]?.Value;
我相信C#团队过去已经考虑过这一点,并发现它有问题,但这并不意味着他们不会在未来重新考虑。
这篇关于为什么在某些语言中,尝试访问空值的属性会导致异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文