1. 集合类addAll方法NPE问题
这个问题直接贴代码会更直观。
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
传值为空直接npe,所以在使用addAll之前得判断集合非空。
2.Optional 中orElse()和orElseGet()问题。
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
我遇到的问题抽象出来大概这样:
val data = Optional.ofNullable(value).map(item -> {
// doSomeThing
}).orelse(obj.getValue);
判断value非空的时候去走map(),里面的代码,为空的时候直接返回obj.getValue(),实际运行的时候value是非空的,但是这块报了npe,原因是obj是null,但是按理来说不会走orElse()的逻辑,但是实际上不是。 不要把optional当成if else,它就是一个简单的方法调用。调用orElse()的时候首先运行了obj.getValue(),然后就报错了。随后改成了
val data = Optional.ofNullable(value).map(item -> {
// doSomeThing
}).orElseGet(()->obj.getValue);
此时只有当value为空的时候,才会去调用obj.getValue().
这俩的区别仅仅就一个延迟加载的问题。
299





