Java8中空指针问题解决
别提了,正在划水的我,突然被领导丢一个日志截图 No value present
咱这专业划水运动员哪里见过这问题呀,赶紧需要亲娘(度娘娘)帮助,查了下资料,再次排查了一下代码。又是一个忍不住口吐芬芳的时刻(嗯,是个狠人)…, 接下来就是见证奇迹的时刻…
optional 类
从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。
🐂🍺时刻
然而我们在使用 Optional 类之前就需要判读 Optional 是否为空,如果这个为空 就会报错 java ava.util.NoSuchElementException: No value present
曾经我出现的问题编写成案例
新建一个实体
public OrderItem(Comparator<Integer> comparator) {
private String id;
private String goodsName;
private Integer goodsNuber;
//无参构造方法
public OrderItem() {
}
//构造方法
public OrderItem(String id, String goodsName, Integer goodsNuber) {
this.id = id;
this.goodsName = goodsName;
this.goodsNuber = goodsNuber;
}
}
方法引用
public void goodsOrder() {
//放入几个参数
ArrayList<OrderItem> orderList = new ArrayList<>();
orderList.add(new OrderItem("1", "苹果", null));
orderList.add(new OrderItem("1", "苹果", null));
orderList.add(new OrderItem("2", "香蕉", null));
//求取GoodsNuber的最大值 -->此时这个方法就会抛出异常
Integer goodsNuber12 = orderList.stream().filter(e -> e.getGoodsNuber() != null).max(Comparator.comparing(OrderItem::getGoodsNuber)).get().getGoodsNuber();
}
控制台输出
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
解析报错
//错误点就是 get() 这里, 因为 Optional为null,再get值肯定报错
Optional<OrderItem> item =orderList.stream().filter(e -> e.getGoodsNuber() != null).max(Comparator.comparing(OrderItem ::getGoodsNuber));
如何解决
使用此方法 isPresent();为了判断查询的类对象是否存在,这里我用正则判断
Optional<OrderItem> item =orderList.stream().filter(e -> e.getGoodsNuber() != null).max(Comparator.comparing(OrderItem ::getGoodsNuber));
Integer goodsNuber1 = item.isPresent()? tem1.get().getGoodsNuber() : null;