自动拆箱导致空指针
变量赋值
public static void main(String[] args) {
Long A = null;
long B = count;
}
方法传参
private static int add(int x, int y) {
return x + y;
}
public static void main(String[] args) {
Integer left = null;
Integer right = null;
System.out.println(add(left, right));
}
为什么会空指针
以长整型为例,拆箱过程将会调用以下方法
Long.longValue();
由于对象是空,所以会抛出空指针异常
数组、集合空指针
对象数组未初始化
public static class User {
private String name;
}
public static void main(String[] args) {
User[] users = new User[10];
for (int i = 0; i != 10; ++i) {
users[i].name = "halo";
}
}
集合批量添加元素方法不支持空对象
public static void main(String[] args) {
List<User> users = new ArrayList<User>();
List<User> nullUsers = null;
users.addAll(nullUsers);
}
查看源码很容易得出答案
/*ArrayList.java*/
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;
}
规避空指针常用方法
public static void main(String[] args) {
User user = null;
Optional<User> optionalUser = Optional.ofNullable(user);
/*存在即返回, 空则提供默认值*/
optionalUser.orElse(new User());
/*存在即返回, 空则由函数去产生*/
optionalUser.orElseGet(() -> anoymos());
/*存在即返回, 否则抛出异常*/
optionalUser.orElseThrow(RuntimeException::new);
/*存在才去做相应的处理*/
optionalUser.ifPresent(u -> System.out.println(u.getName()));
/*级联操作*/
optionalUser.map(u -> u.getName()).map(name -> name.length()).orElse(0);
}