Tag: null

object – How to avoid null checking in Java?

The Question : 4113 people think this question is useful I use object != null a lot to avoid NullPointerException. Is there a good alternative to this? For example I often use: This checks for a NullPointerException for the someobject object in the above snippet. The Question Comments : @Shervin Encouraging nulls makes the code

python – Python中的null对象?

我如何引用Python中的空对象? 在Python中,’null’对象是单例None。 检查“无”的最好方法是使用身份运算符is: if foo is None: ... 它不像其他语言那样调用null,但是None。这个对象总是只有一个实例,所以你可以检查与x is None(身份比较)的等价性,而不是x == None如果你想。 在Python中,为了表示缺少值,可以对对象使用None值(types.NoneType.None),对于字符串可以使用“”(或len()== 0)。因此: if yourObject is None: # if yourObject == None: ... if yourString == "": # if yourString.len() == 0: ... 关于“==”和“is”之间的区别,使用“==”测试对象标识应该足够了。但是,由于操作“is”被定义为对象标识操作,所以使用它可能更为正确,而不是“==”。不知道是否有速度差异。 无论如何,你可以看看: Python 内置常量 doc页面。 Python 真理价值测试 doc页面。

避免!= null 语句块

我用object != null了很多来避免NullPointerExceptions。 有没有一个很好的选择呢? 例如: 这避免了NullPointerException,如果不知道对象是否null。 @Shervin鼓励的空值使得代码不易理解,不太可靠。 不使用null比这里的其他建议更好。抛出异常,不要返回或允许空值。顺便说一句 – ‘断言’关键字是无用的,因为它是默认禁用。使用始终启用的失败机制. 这是我现在使用Scala的一个原因。在斯卡拉,一切都不是空的。如果你想允许传递或返回“nothing”,那么你必须明确地使用Option [T]而不是T als参数或返回类型。 @thSoft事实上,斯卡拉的真棒Option类型是由语言不愿意控制或不允许的损害null。我在黑客新闻上提到过这个,并被告知“无论如何Scala中没有人使用null”。猜猜看,我已经在同事写的Scala中找到了空值。是的,他们是“做错了”,必须接受教育,但事实仍然是语言的类型系统应该保护我从这个,而不是:( 对我而言,这听起来像是一个相当普遍的问题,初级到中级开发人员在某些时候往往会面临这样的问题:他们要么不知道,要么不信任他们正在参与的合同,并且防御性地检查空值。另外,在编写自己的代码时,他们倾向于依靠返回的空值来指示某些事情,因此需要调用者检查空值。 换句话说,有两个实例出现空检查: 凡无效是合同有效的答复; 和 哪里不是有效的答复。 (2)很容易。使用assert语句(断言)或允许失败(例如, NullPointerException)。断言是1.4中添加的一个使用率很低的Java特性。语法是: 要么: 其中<condition>是一个布尔表达式,并且<object>是其toString()方法的输出将包含在错误中的对象。 一个assert语句抛出一个Error(AssertionError如果条件是不正确的)。默认情况下,Java会忽略断言。您可以通过将选项传递-ea给JVM 来启用断言。您可以启用和禁用个别类和包的声明。这意味着您可以在开发和测试的同时使用断言验证代码,并在生产环境中禁用它们,尽管我的测试显示接近断言的性能影响。 在这种情况下不使用断言是可以的,因为代码将会失败,如果使用断言就会发生这种情况。唯一的区别是,断言可能会更快地发生,以更有意义的方式,并可能有额外的信息,这可能会帮助你弄清楚为什么如果你不期待它发生。 (1)有点困难。如果你无法控制你打电话的代码,那么你就被卡住了。如果null是有效的响应,则必须检查它。 如果它是你所控制的代码,那么情况往往是这样的,那么情况就不一样了。避免使用空值作为回应。使用返回集合的方法,很简单:几乎总是返回空集合(或数组)而不是空值。 非收藏可能会更困难。考虑这个例子:如果你有这些接口: 在这里Parser需要原始的用户输入,并找到要做的事情,也许如果你正在实现一个命令行界面的东西。现在,如果没有适当的操作,您可以使合同返回null。这导致你正在谈论的空检查。 另一种解决方案是永远不会返回null,而是使用Null Object模式: 比较: 至: ParserFactory.getParser().findAction(someInput).doSomething(); 这是一个更好的设计,因为它导致更简洁的代码。 也就是说,对于findAction()方法来说,抛出一个有意义的错误信息的Exception是完全合适的,特别是在这种情况下,你依赖于用户输入。findAction方法抛出一个Exception比调用方法抛出一个简单的NullPointerException没有任何解释更好。 或者,如果您认为try / catch机制太丑陋了,而不是Do Nothing,您的默认操作应该向用户提供反馈。   我不同意你的DO_NOTHING行动的陈述。如果查找操作方法找不到操作,则返回null是正确的操作。你已经在你的代码中“找到”了一个没有被发现的动作,这违反了方法的原理,找到了一个可用的动作。 我同意null在Java中被滥用,尤其是在列表中。所以许多apis会更好,如果他们返回一个空的列表/数组/集合而不是null。很多时候,应该抛出异常的地方使用null。如果解析器无法解析,则应抛出异常。 后面这个例子是IIRC,空对象设计模式。 @Cshah(和MetroidFan2002)。简单的说,把它写进合同中,那么很明显,一个没有找到的回复动作什么都不会做。如果这是调用者的重要信息,那么提供一种方法来发现它是一个未发现的行为(即提供一种方法来检查结果是否是DO_NOTHING对象)。或者,如果通常应该找到操作,那么你仍然不应该返回null,而是抛出一个特别指出这个条件的异常 – 这仍然会导致更好的代码。如果需要,提供一个单独的方法返回布尔值来检查是否存在操作。 简明不等于质量代码。对不起,你是这么想的。你的代码隐藏了一个错误是有利的情况。