当前位置: 首页 > 知识库问答 >
问题:

在Java中表示“既不为空也不相等”的实用方法

丁星火
2023-03-14
String str = "abc";

如下所示比较此字符串变量

if(str.equals("abc")) {}

如果strnull,则会导致java.lang.NullPointerException被抛出。

为避免这种情况,可能会强制执行额外的空检查。例如,

if(str != null && str.equals("abc")) {}

我觉得它很丑陋。更好的可以重写如下。

if("abc".equals(str)) {}

这将永远不会抛出java.lang.NullPointerExc的,即使strnull。此外,对象等于null从来都不是真的。

然而,最后一种情况不能使用,当条件表达式像这样倒置时,

if(!"abc".equals(str)) {
    System.out.println(str.length());
}

这将在if块中导致java.lang.NullPointerExcgon,如果strnull

如果不重写下面这样的条件语句,是否可以避免这种情况?

if(str != null && !"abc".equals(str)) {}

这是非常丑陋和不可读的。

虽然该示例使用了String对象,但它可能是一个更复杂的对象。

共有3个答案

解鸿运
2023-03-14

避免null的另一种可能方法是使用assert:在另一个类似的问题中查看这个答案:

如何在继续之前检查一组变量是否不为 null

邓丰
2023-03-14

如果您想使用str,您必须在某个时候检查null。根本没有办法绕过它。您可以将此检查包装到额外的实用程序函数或类似的东西中,但最终您将无法绕过额外的检查。

如果你是使用大量其他库的朋友,你可以使用 org.apache.commons.lang.StringUtils#length(java.lang.String)。这正好是你想要的,也许你的应用程序中有一个这样的库。阿帕奇只是一个例子。周围肯定还有其他人做类似的事情。

如果您想一起删除null检查,那么更好的问题是:为什么str可以是null,并且可以通过从一开始就不接受这个值来防止它是null

薛淳
2023-03-14

另一种选择是使用Java8可选包装器

Optional<Customer> optional = findCustomer();

if (optional.isPresent()) {
Customer customer = maybeCustomer.get();
    ... use customer ...
}
else {
    ... deal with absence case ...
}

来源:https://dzone.com/articles/java-8-optional-how-use-it

 类似资料:
  • 问题内容: 我已经看到了同时使用,并为 不等于 。首选语法是什么,为什么? 我喜欢,因为让我想起。 问题答案: 从技术上讲,如果您使用SQL Server AKA T-SQL,它们的功能相同。如果您在存储过程中使用它,则没有性能上的理由要使用另一个。然后归结为个人喜好。我更喜欢使用<>,因为它符合ANSI。 您可以在以下位置找到各种ANSI标准的链接: http://en.wikipedia.or

  • 问题内容: 首先采取klurudge解决方案,使用哨兵方法(必须让您的程序不允许输入哨兵值): 假设您忘记了阻止程序中的哨兵值,用户在B字段中输入了-2147483648,而A为空。上面的代码报告为true,应报告为false,不应报告为true或null。 比较可为空字段上的相等性的最简洁方法是什么?A == B仅应报告true或false,而不管该字段是否可为空。 问题答案: 也许IS [NO

  • 我使用包。当我编写''函数时,例如、等,会出现此错误消息。 错误:IllegalArgumentException(Java):您的InputStream既不是OLE2流,也不是OOXML流 在使用这个函数之前,我按照http://www.r-bloggers.com/get-r-and-java-1-8-to-work-cogether-on-osx/link的方式对R和Mac OS X之间的崩

  • 问题内容: 我有一个应该相等的整数(我通过输出验证了它)。但是在我的情况下,Java看不到这些变量具有相同的值。 我有以下代码: 并产生以下输出: 可能我必须添加定义如下的内容: 并且我们从环路构造采取: 因此,这两个变量都具有整数类型。 问题答案: 查看本文:装箱的值和相等性 使用或比较包装器类型(例如s,s或s)时,您 会将它们作为引用* 而不是值 进行比较 。 * 如果两个变量指向不同的对象

  • 我需要做以下工作 那么我怎样才能做到这一点呢。任何建议,谢谢。

  • 我有以下人物班- <代码>人。java - 现在,我有以下TreeClass实例- 打印时- 很明显,两个人的例子-