本文翻译自国外编程问答网站Programmers Stack Exchange中的一个热门问答:
Are null references really a bad thing?
问题
我曾听说有人说过,包含空引用的编程语言是一个价值十亿美元的错误(译者注:图灵奖得主Tony Hoare说过)。但是为什么呢?当然,他们可能会导致NullReferenceException,但那又怎样?只要使用不当,一个语言的任何一个元素都可导致错误啊。
还有其他的选择吗?我一般在代码中这么写:
Customer c = Customer.GetByLastName("Goodman"); // returns null if not found
if (c != null)
{
Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!");
}
else { Console.WriteLine("There was no customer named Goodman. How lame!"); }
你可能这么用:
if (Customer.ExistsWithLastName("Goodman"))
{
Customer c = Customer.GetByLastName("Goodman") // throws error if not found
Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!");
}
else { Console.WriteLine("There was no customer named Goodman. How lame!"); }
但你的做法又比我的好在哪里呢?无论哪种方式,如果你忘了检查Customer是否存在,你会得到一个异常。我猜测可能是因为调试CustomerNotFoundException可能比NullReferenceException更容易,因为他描述的更清楚。这就是全部原因吗?
最佳答案
null是邪恶的(译者注:回答者在回答提问者的关于为什么空引用能导致十亿美金的损失的问题)
在infoQ上有一篇关于这个的演讲:Null References: The Billion Dollar Mistake by Tony Hoare
Option类型(译者注:回答者告诉提问者可以使用什么方式避免使用空引用)
在函数式编程中有一个选择就是使用Option类型,他可以包含某个值和NONE
The “Option” Pattern讨论了Option类型,并介绍了java中的实现。(译者注:在java8中提供了Optional类型)
我还发现了一个Java中关于这个问题的错误报告:Add Nice Option types to Java to prevent NullPointerExceptions.
另一个高分回答
问题在于,理论上任何一个对象都有可能是null,并且当你试图使用他的时候就会抛出异常。你的面向对象代码基本上就是一个定时炸弹。
你是对的,使用if语句进行非空检查是一种优雅的处理方式。但是如果一个你确信不可能为null的对象的值为null了会怎么样?敢肯定的有两件事。1、这绝对不是一件好事儿。2、你肯定不希望他发生。
还有,千万不要忽视"容易debug"这个好处,成熟的代码都是庞然大物。一个好的错误提示会节省你几个小时的时间。
年前再来转转!