为什么在某些语言中,尝试访问空值的属性会导致异常? [英] Why does trying to access a property of null cause an exception in some languages?

查看:0
本文介绍了为什么在某些语言中,尝试访问空值的属性会导致异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

某些编程语言(例如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

如果foobarbaz中的任何一个为空,则我的代码被破解。:(此外,如果我在控制台中计算以下表达式,似乎有不一致的结果:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆