在爪哇NPE(空指针异常)是一个例外,说“您正在尝试使用空对象”。例如,语句myNote.getLines() 在编译时不会产生错误。但是,null.getLines() 将在myNote==null 处执行,并且会抛出 NPE,因为“在 null 中没有类似 getLines() 的方法”。

所有 Java 引用类型对象都可以为 null,但使用它们会引发异常。危险的。 "零安全”,所以你应该尊重它。

有多种安全处理 null 的方法和机制,但主要是可选的记下如何使用(本文是在考虑 Java SE 8 的情况下编写的。)

你容易犯的错误

虽然这是一个以“让我们检查 null,因为 null 可以在任何地方输入”结尾的故事,但我将列出错误。

在 if 语句中

不想写很久了,所以如果我反复试验,我可能会忘记检查是否为空。

反转空检查的顺序

// 出る
if(myNote.getLines().size() > 0 && myNote.getLines() != null)
// 出ん
if(myNote.getLines() != null && myNote.getLines().size() > 0)

对象.equals()使用更好的模式

// 出る
if(myNote.getTitle().equals("No title"))
// 出ん
if("No title".equals(myNote.getTitle()))
// 安全
if(Objects.equals(myNote.getTitle(), "No title"))

在深度嵌套的对象中

我倾向于粗心。

// getTitle()がnullだと結局出る
if(Objects.equals(myNote.getTitle().length(), 5))
// 出ない(もっと良い書き方があるかもしれない)
if(Objects.nonNull(myNote.getTitle()) 
    && Objects.equals(myNote.getTitle().length(), 5))

也许最好先检查 null

// とても入り組んだ複雑な文
complex.getAList().stream().map(a -> a.getBList().stream()...)
// 例えばこんな感じ…?
if(Objects.isNull(complex.getAList())){
    return null;
}
complex.getAList().stream().filter(Objects::nonNull)...

像这样的片段

与流相关的示例

// barがnullだと、NPEが出る
List<String> baz = foo.getBar().stream()....

// barがnullだと、bazには空のArrayListが入る (省略してるところでstreamをListに直してる)
List<String> baz = Optional.ofNullable(foo.getBar()).orElse(new ArrayList<String>()).stream()...

// barがnullだと、bazにはnullが入る
List<String> baz = null;
Optional.ofNullable(foo.getBar()).ifPresent(e -> {
			baz = e.stream()...
		});

↑更真实的例子

Integer sizes = null;
Optional.ofNullable(myNote.getLines()).ifPresent(line -> {
    sizes = e.stream()
        .map(line -> line.size())
        .collect(Collectors.toList());
});

深拷贝(参考)

List<String> b = Optional.ofNullable(a)
    .map(list -> (List<String>) new ArrayList<>(list))
    .orElseGet(Collections::emptyList);

在最后

“麻烦了,我只想赋值就得用3行吗?Java的语言设计不好吗?十亿美元的失败日元贬值将加速...! ” 并且不用多说地堆起礼貌的编码。我意识到这是成为一名优秀工程师的第一步。我写了一个反思声明,因为2022年不能例外。这是 NPE 坟墓标记。再见。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308633017.html

相关文章:

  • 2021-09-21
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
  • 2021-12-24
  • 2021-06-22
  • 2021-04-09
猜你喜欢
  • 2022-12-23
  • 2021-12-27
  • 2021-09-11
  • 2021-09-09
  • 2022-12-23
  • 2021-09-21
相关资源
相似解决方案