1 NPE 异常
2 赋值时自动拆箱出现NPE
变量赋值时 自动箱出现的空指针
方法传参时 自动拆箱出现的空指针
3 字符串,数组,集合在使用时出现空指针怎么办?
// 1. 字符串使用 equals 可能会报空指针错误
// System.out.println(stringEquals("xyz", null));
// System.out.println(stringEquals(null, "xyz"));
// 2. 对象数组 new 出来, 但是元素没有初始化
// User[] users = new User[10];
// for (int i = 0; i != 10; ++i) {
// //users[i] = new User();
// users[i].name = "imooc-" + i;
// }
// 3. List 对象 addAll 传递 null 会抛出空指针
List<User> users = new ArrayList<User>();
User user = null;
List<User> users_ = null;
users.add(user);
users.addAll(users_);
4 使用Optional 规避空指针时,需要注意些什么?
public class OptionalUsage {
private static void badUsageOptional() {
Optional<User> optional = Optional.ofNullable(null);
User user = optional.orElse(null); // good
user = optional.isPresent() ? optional.get() : null; // bad
}
public static class User {
private String name;
public User(String name) {
this.name = name;
}
public User() {
}
public String getName() {
return name;
}
}
private static void isUserEqualNull() {
User user = null;
if (user != null) {
System.out.println("User is not null");
} else {
System.out.println("User is null");
}
Optional<User> optional = Optional.empty();
if (optional.isPresent()) {
System.out.println("User is not null");
} else {
System.out.println("User is null");
}
}
private static User anoymos() {
return new User();
}
public static void main(String[] args) {
// 没有意义的使用方法
// isUserEqualNull();
// User user = null;
User user = new User("12");
// Optional<User> user1 = Optional.ofNullable(user);
Optional<User> optionalUser = Optional.ofNullable(user);
// // 存在即返回, 空则提供默认值
// optionalUser.orElse(new User());
// // 存在即返回, 空则由函数去产生
// optionalUser.orElseGet(() -> anoymos());
// // 存在即返回, 否则抛出异常
// optionalUser.orElseThrow(RuntimeException::new);
// 存在才去做相应的处理
// optionalUser.ifPresent(u -> System.err.println(u.getName()));
// map 可以对 Optional 中的对象执行某种操作, 且会返回一个 Optional 对象
// Optional<String> name = optionalUser.map(u -> u.getName());
// String anymos = name.orElse("anymos");
// System.err.println(anymos);
// // map 是可以无限级联操作的
Integer integer = optionalUser.map(u -> u.getName()).map(name -> name.length()).orElse(0);
System.err.println(integer);
}
}
5 编码中常见的异常(并发修改,类型转换,枚举查找)及其解决方案
// 直接使用 for 循环会触发并发修改异常
// for (User user : users) {
// if (user.getName().equals("imooc")) {
// users.remove(user);
// }
// }
// 使用迭代器则没有问题
Iterator<User> iter = users.iterator();
while (iter.hasNext()) {
User user = iter.next();
if (user.getName().equals("imooc")) {
iter.remove();
}
}
}```