## NPE ### for 循环的对象为空 ```java public static void main(String[] args) { List<Integer> list = null; for(Integer i : list) { System.out.println(i); } } ``` ### BigDecimal 数组为空 ```java public static void main(String[] args) { int[] arrInt = new int[3]; int i = arrInt[0] + 1; System.out.println(i); // 正常打印 BigDecimal[] arr = new BigDecimal[3]; BigDecimal bigDecimal = arr[0].add(BigDecimal.ONE); System.out.println(bigDecimal); // 抛 NPE } ``` ### List 的 addAll 从语义上讲,向集合中添加 "nothing" (null) 是没有意义的。addAll 方法的目的是添加一个集合中的所有元素,而不是添加"无"。 ```java public boolean addAll(Collection<? extends E> c) { Objects.requireNonNull(c); // 快速检查,如果 c 为 null,立即抛出 NullPointerException boolean modified = false; for (E e : c) { if (add(e)) modified = true; } return modified; } ``` 如果没有 `Objects.requireNonNull(c)` 这行代码,当 `c` 为 null 时,会在 for 循环中抛出 NullPointerException。这样的异常信息不够明确,可能会误导开发者认为问题出在循环内部的某个元素上。 ## ClassCastException ```java public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); map.put("addback", true); System.out.println(Boolean.parseBoolean((String) map.get("addback"))); } ``` ```java Object obj = new BigDecimal("123.45"); // 这是非法的,会抛出 ClassCastException String str = (String) obj; ``` `()`的方式做强制类型转换,从 JVM 的视角,两个类的元数据要在多态的那套体系内,前者要兼容后者,像 String 和 BigDecimal 就属于 JVM 里面两个东西八竿子打不着一撇 ### IndexOutOfBoundsException