Questions tagged «null»

Null是缺少值。Null通常用于指示引用或指针变量指向内存中没有对象。

22
空引用真的是一件坏事吗?
我听说它说在编程语言中包含空引用是“十亿美元的错误”。但为什么?当然,它们会导致NullReferenceExceptions,但是那又如何呢?如果使用不当,该语言的任何元素都可能成为错误的来源。 还有什么选择?我想不是这样说: 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 …

16
如果他不期望为空,是否应该检查为空?
上周,我们就在应用程序的服务层中处理null产生了激烈的争论。问题是在.NET上下文中,但在Java和许多其他技术中将是相同的。 问题是:无论什么情况,您是否应该始终检查null并使代码正常工作,还是当意外收到null时让异常冒出? 在我看来,一方面,在您不期望它的地方检查空值(即,没有用户界面来处理它)与编写带有空catch的try块相同。您只是隐藏一个错误。错误可能是代码中的某些内容已更改,并且null现在是预期值,或者存在其他错误,并且将错误的ID传递给该方法。 另一方面,检查空值通常是一个好习惯。此外,如果进行检查,则应用程序可能会继续运行,而只有一小部分功能无效。然后,客户可能会报告一个小错误(例如“无法删除评论”),而不是更严重的错误(例如“无法打开页面X”)。 您遵循哪种做法,您对这两种方法的论点是什么? 更新: 我想添加一些有关我们特殊情况的细节。我们正在从数据库中检索一些对象,并对它们进行了一些处理(比如,建立一个集合)。编写代码的开发人员并不预期该对象可以为null,因此他不包含任何检查,并且在加载页面时出现错误,并且整个页面都没有加载。 显然,在这种情况下,应该进行检查。然后,我们讨论了是否应该检查每个处理的对象(即使不会丢失),以及是否应该静默中止最终的处理。 假设的好处是该页面将继续工作。考虑一下Stack Exchange上不同组(用户,评论,问题)的搜索结果。该方法可以检查是否为空,并中止用户的处理(由于错误为空),但返回“评论”和“问题”部分。该页面将继续工作,只是缺少“用户”部分(这是一个错误)。我们应该尽早失败并中断整个页面,还是继续工作并等待有人注意到“用户”部分丢失了?

10
如果null不好,为什么现代语言会实现它呢?[关闭]
我确定像Java或C#这样的语言的设计师都知道与空引用存在有关的问题(请参阅空引用真的是一件坏事吗?)。另外,实现选项类型实际上并不比空引用复杂得多。 他们为什么仍然决定将其包括在内?我确信缺少空引用会鼓励(甚至强迫)语言创建者和用户使用质量更高的代码(尤其是更好的库设计)。 仅仅是因为保守主义吗?“其他语言也有,我们也必须有……”?

12
SQL:空字串与NULL值
我知道这个话题有点争议,互联网上有很多各种各样的文章/观点。不幸的是,他们中的大多数人都假设该人不知道NULL和空字符串之间的区别是什么。因此,他们通过联接/聚集讲述令人惊讶的结果的故事,并且通常会做一些更高级的SQL课程。这样,他们绝对会遗漏所有要点,因此对我毫无用处。因此,希望这个问题和所有答案将使话题向前发展。 假设我有一个包含个人信息(姓名,出生等)的表,其中的一列是具有varchar类型的电子邮件地址。我们假设由于某些原因,某些人可能不想提供电子邮件地址。将此类数据(不带电子邮件)插入表时,有两个可用的选择:将单元格设置为NULL或将其设置为空字符串('')。让我们假设我知道选择一个解决方案而不是另一个解决方案的所有技术含义,并且可以为任何一种情况创建正确的SQL查询。问题是,即使两个值在技术层面上都不同,但在逻辑层面上却完全相同。看完NULL和”之后,我得出一个结论:我不知道那个人的电子邮件地址。也不管我怎么努力 我无法使用NULL或空字符串发送电子邮件,因此显然大多数SMTP服务器都同意我的逻辑。所以我倾向于在不知道该值的地方使用NULL,并认为空字符串是一件坏事。 经过与同事的激烈讨论,我提出了两个问题: 我是否假设使用空字符串作为未知值会导致数据库对事实“撒谎”,对吗?更准确地说:使用SQL关于什么是价值和什么不是价值的想法,我可能得出结论:我们拥有电子邮件地址,只是发现它不为空。但是后来,当尝试发送电子邮件时,我会得出一个矛盾的结论:不,我们没有电子邮件地址,@!#$数据库一定在撒谎! 是否有逻辑上的情况,其中空字符串”可以很好地承载重要信息(除了值和没有值),而通过其他任何方式(如附加列)进行存储都会很麻烦/效率低下。我见过很多帖子声称有时将空字符串与实数值和NULL一起使用是很好的,但是到目前为止,还没有看到一种合乎逻辑的方案(就SQL / DB设计而言)。 PS有些人会很想回答,这只是个人品味的问题。我不同意 对我来说,这是一个具有重大后果的设计决策。因此,我希望看到一些出于逻辑和/或技术原因而对此表示反对的答案。
72 design  database  sql  strings  null 

7
Null的姓氏如何在许多数据库中引起问题?
我读了一篇关于英国广播公司的文章。他们说的一个例子是,姓“ Null”的人在某些网站上输入详细信息时遇到问题。 没有给出关于他们面临的错误的解释。 但据我所知,字符串“ Null”和实际的Null值完全不同(从数据库的角度来看)。 为什么这会在数据库中引起问题?
71 database  null 

24
如何解释NULL和零之间的区别?
处理使用百分比变化公式的问题: percent change = 100 * [(new value - old value) / old value] 如果对new value or old value = NULL,而不是0对可能不是程序员的人,我该怎么解释? 我的老板想知道为什么TextBox中有一个空字符串而不是一个值,因为我们有旧值,但是没有新值。
59 null  tsql 

5
具有Maybe类型而不是null的语言如何处理边缘条件?
埃里克·利珀特(Eric Lippert)在讨论为什么C#使用a null而不是Maybe<T>类型时提出了一个非常有趣的观点: 类型系统的一致性很重要;我们是否总能知道在任何情况下都不能将非空引用视为无效?在引用类型为非空字段的对象的构造函数中该怎么办?在这样的对象的终结器中,该对象被终结是因为应该填充引用的代码引发了异常,该怎么办?对于您而言,保证其安全性的类型系统很危险。 这有点大开眼界。这些概念引起了我的兴趣,并且我在编译器和类型系统上做了一些尝试,但我从未考虑过这种情况。具有Maybe类型而不是null的语言如何处理诸如初始化和错误恢复之类的极端情况,在这种情况下,据称保证的非null引用实际上并不处于有效状态?

8
当可以有意义地缺少值时,新的布尔字段是否比空引用更好?
例如,假设我有一个类Member,它具有一个lastChangePasswordTime: class Member{ . . . constructor(){ this.lastChangePasswordTime=null, } } 缺少其lastChangePasswordTime可能是有意义的,因为某些成员可能永远不会更改其密码。 但是根据“ 如果空值是邪恶的”,当可以有意义地缺少一个值时应该使用什么?和https://softwareengineering.stackexchange.com/a/12836/248528,我不应该使用null来表示有意义的缺失值。所以我尝试添加一个布尔标志: class Member{ . . . constructor(){ this.isPasswordChanged=false, this.lastChangePasswordTime=null, } } 但是我认为它已经过时了,因为: 当isPasswordChanged为false时,lastChangePasswordTime必须为null,并且检查lastChangePasswordTime == null与检查isPasswordChanged为false几乎相同,因此我更喜欢直接检查lastChangePasswordTime == null。 在此处更改逻辑时,我可能会忘记同时更新两个字段。 注意:当用户更改密码时,我会这样记录时间: this.lastChangePasswordTime=Date.now(); 此处的附加布尔字段是否比空引用更好?
39 null  boolean 

4
空值存储在哪里,或者根本存储在哪里?
我想了解空值或空引用。 例如,我有一个名为Apple的类,并创建了它的一个实例。 Apple myApple = new Apple("yummy"); // The data is stored in memory 然后我吃了那个苹果,现在它需要为空,因此我将其设置为空。 myApple = null; 打电话之后,我忘记了吃了它,现在想检查一下。 bool isEaten = (myApple == null); 通过此调用,myApple在哪里引用?null是一个特殊的指针值吗?如果是这样,如果我有1000个空对象,如果我们认为指针类型为int的话,它们会占用1000个对象存储空间还是1000个int存储空间?
39 memory  null 

7
为什么“对象引用未设置为对象的实例”不能告诉我们哪个对象?
我们正在启动一个系统,有时我们会收到NullReferenceException消息中著名的异常Object reference not set to an instance of an object。 但是,在一种有将近20个对象的方法中,记录一个对象为空的日志实际上根本没有用。这就像告诉您,当您是研讨会的安全人员时,100位参加者中的一个人是恐怖分子。真的对您毫无用处。如果要检测哪个人是威胁性的人,则应该获取更多信息。 同样,如果要删除该错误,则需要知道哪个对象为空。 现在,有些事情困扰了我几个月,这就是: .NET为什么不给我们名称或对象引用的类型(至少为null)?。它不能从反射或任何其他来源理解类型吗? 另外,了解哪个对象为空的最佳实践是什么?我们是否应该始终在这些上下文中手动测试对象的可空性并记录结果?有没有更好的办法? 更新: 异常The system cannot find the file specified具有相同的性质。在附加到进程并进行调试之前,您无法找到哪个文件。我猜这些类型的异常会变得更聪明。如果.NET可以告诉我们c:\temp.txt doesn't exist.而不是一般性消息,会更好吗?作为开发人员,我投赞成票。

7
即使我知道该方法无法返回错误的输入,我也应该验证方法调用的返回值吗?
我想知道我是否应该通过验证方法调用的返回值是否符合我的期望来进行防御,即使我知道我正在调用的方法将满足此类期望也是如此。 给予 User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 我应该做吗 void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } 要么 void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …

9
为什么大多数“知名”命令式/ OO语言都允许未经检查的类型代表“无”值的访问?
我一直在阅读关于拥有null而不是(例如)的(不便)便利的信息Maybe。阅读本文之后,我相信使用Maybe(或类似方法)会更好。但是,令我惊讶的是,所有“众所周知”的命令式或面向对象的编程语言仍在使用null(这允许对可以表示“无”值的类型进行未经检查的访问),并且Maybe大多数在函数式编程语言中使用。 作为示例,请看下面的C#代码: void doSomething(string username) { // Check that username is not null // Do something } 这里有些难闻的气味...为什么我们要检查参数是否为null?我们不应该假设每个变量都包含对对象的引用吗?如您所见,问题在于,根据定义,几乎所有变量都可以包含空引用。如果我们可以决定哪些变量是“可为空的”而哪些则不是呢?这将节省我们调试和寻找“ NullReferenceException”时的工作量。想象一下,默认情况下,没有类型可以包含null引用。取而代之的是,您将明确声明变量只有在确实需要时才可以包含空引用。那就是Maybe背后的想法。如果您的函数在某些情况下会失败(例如,被零除),则可以返回Maybe<int>,明确指出结果可能是整数,但也没有任何结果!这是选择Maybe而不是null的原因之一。如果您对更多示例感兴趣,那么我建议阅读这篇文章。 事实是,尽管存在使大多数类型默认为可空的缺点,但大多数OO编程语言实际上都可以做到这一点。这就是为什么我想知道: 您必须用null编程语言来实现什么样的参数Maybe呢?完全有原因还是仅仅是“历史包bag”? 在回答此问题之前,请确保您了解null和Maybe之间的区别。

6
空指针与空对象模式
归因:这源于一个相关的P.SE问题 我的背景是C / C ++,但是我在Java中工作了很多,目前正在编写C#。由于我的C语言背景,检查传递的指针和返回的指针是二手的,但是我承认这偏颇了我的观点。 最近,我提到了空对象模式,其中的想法是始终返回对象。正常情况下返回预期的填充对象,错误情况下返回空对象而不是空指针。前提是调用函数将始终具有某种要访问的对象,因此避免了空访问内存冲突。 那么,与使用Null Object Pattern相比,Null Check的利弊是什么? 我可以看到带有NOP的更干净的调用代码,但是我还可以看到它将在何处创建隐藏的失败,否则这些失败将不会引发。我宁愿让我的应用程序在开发过程中严重失败(又称异常),而不愿让无声的错误逃脱。 空对象模式不能像不执行空检查一样具有类似的问题吗? 我使用过的许多对象都拥有自己的对象或容器。似乎我必须有一个特殊情况,才能保证所有主要对象的容器都有自己的空对象。多层嵌套似乎会使这种情况变得难看。

7
引发ArgumentNullException有何帮助?
假设我有一个方法: public void DoSomething(ISomeInterface someObject) { if(someObject == null) throw new ArgumentNullException("someObject"); someObject.DoThisOrThat(); } 我受过训练,相信抛出的错误ArgumentNullException是“正确的”,但是“对象引用未设置为对象的实例”错误意味着我有一个错误。 为什么? 我知道,如果我要缓存对引用的引用someObject并在以后使用它,那么最好在传入时检查是否为空,并尽早失败。但是,如果我在下一行取消引用,为什么要进行检查?它将以一种方式或另一种方式引发异常。 编辑: 这只是我想到的...担心被取消引用的null是否来自不检查您的C ++之类的语言(即,它只是尝试在内存位置0 +方法偏移处执行某些方法)?
27 c#  null 

8
如果空值是邪恶的,那么当值可以有意义地缺失时应该使用什么?
这是一遍又一遍重复的规则之一,这令我感到困惑。 空是邪恶的,应尽可能避免。 但是,但是-出于我的天真,让我尖叫-有时可能会有意义地缺乏价值! 请让我在一个示例中问这个问题,该示例来自我目前正在研究的此反模式缠身的可怕代码。从本质上讲,这是一个基于多人网络回合的游戏,其中两个玩家的回合都同时运行(例如在Pokemon中,与Chess相反)。 每次转动之后,服务器都会广播客户端JS代码的更新列表。Update类: public class GameUpdate { public Player player; // other stuff } 此类被序列化为JSON并发送到连接的播放器。 大多数更新自然都会有一个与之相关的玩家-毕竟,有必要知道哪个玩家在此回合​​中做出了哪个动作。但是,某些更新无法使Player有意义地与它们相关联。示例:游戏被强行捆绑,因为超出了没有动作的回合限制。我认为,对于此类更新,让播放器为空是有意义的。 当然,我可以利用继承来“修复”此代码: public class GameUpdate { // stuff } public class GamePlayerUpdate : GameUpdate { public Player player; // other stuff } 但是,由于两个原因,我看不到有什么改进: 现在,JS代码将简单地接收不带Player的对象作为已定义的属性,这与它为null相同,因为两种情况都需要检查该值是否存在。 如果将另一个可为空的字段添加到GameUpdate类中,则我必须能够使用多重继承来继续进行此设计-但是MI本身是邪恶的(根据经验更丰富的程序员),更重要的是,C#不会有它,所以我不能使用它。 我有一个暗示,这段代码是经验丰富的优秀程序员惊骇地尖叫的其中之一。同时,我看不到这个null会如何伤害任何事物,而应该怎么做。 你能向我解释这个问题吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.