在爪哇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