避坑指南-空指针异常

202 阅读1分钟

自动拆箱导致空指针

变量赋值

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);
}