可迭代对象在遍历的同时做修改,则会报并发修改异常

    1. public class Main {
    2. public static class User {
    3. private String name;
    4. public User(String name) {
    5. this.name = name;
    6. }
    7. public String getName() {
    8. return name;
    9. }
    10. }
    11. private static void concurrentModificationException(ArrayList<User> users) {
    12. // 直接使用 for 循环会触发并发修改异常
    13. // 抛出 java.util.ConcurrentModificationException
    14. for (User user : users) {
    15. if ("Bob".equalsIgnoreCase(user.getName())) {
    16. users.remove(user);
    17. }
    18. }
    19. // 使用迭代器则不会触发异常
    20. Iterator<User> iter = users.iterator();
    21. while (iter.hasNext()){
    22. User user = iter.next();
    23. if ("Bob".equalsIgnoreCase(user.getName())){
    24. iter.remove();
    25. }
    26. }
    27. }
    28. public static void main(String[] args) {
    29. ArrayList<User> users = new ArrayList<>(
    30. Arrays.asList(new User("Linda"), new User("Bob"))
    31. );
    32. concurrentModificationException(users);
    33. }
    34. }

    类型转换不符合 Java 的继承关系,则会报类型转换异常

    1. public class Parent{}
    2. public class Son1 extends Parent{}
    3. public class Son2 extends Parent{}
    4. public static void main(String[] args) {
    5. Parent p1 = new Son1();
    6. Parent p2 = new Son2();
    7. // 如果将 p2 强转为 Son1,则会抛出 ClassCastException,即类型转换异常
    8. Son1 s = (Son1) p2;
    9. // 如果需要知道某个类是否是某个类的实例,有两种方法:
    10. // 1.instanceof 关键字
    11. p2 instanceof Son1
    12. // 2.获取 Class 的名称
    13. p2.getClass().getName()
    14. }

    枚举在查找时,如果枚举值不存在,不会返回空,而是直接抛出异常:

    1. // 自定义枚举类
    2. public static enum EnumType {
    3. ERROR_CODE(1001, "错误"),
    4. SUCCESS_CODE(2001, "成功");
    5. Integer code;
    6. String value;
    7. EnumType(Integer code, String value) {
    8. this.code = code;
    9. this.value = value;
    10. }
    11. }
    12. // 通过字符串查找枚举值
    13. private static EnumType enumType(String type){
    14. // 当 type 在枚举类中不存在时,会抛出 java.lang.IllegalArgumentException 异常
    15. return EnumType.valueOf(type);
    16. }
    17. /* 解决办法 */
    18. // 1.对异常进行捕获
    19. private static EnumType enumType(String type){
    20. try {
    21. return EnumType.valueOf(type);
    22. } catch (IllegalArgumentException exception){
    23. return null;
    24. }
    25. }
    26. // 2.通过循环判断,避免异常,但效率较低
    27. private static EnumType enumType(String type){
    28. for (EnumType value : EnumType.values()) {
    29. if (value.name().equals(type)){
    30. return value;
    31. }
    32. }
    33. return null;
    34. }
    35. // 3.静态 Map 索引,只有在 Map 索引建立时有一次循环
    36. private static final Map<String,EnumType> typeIndex = new HashMap<>(EnumType.values().length);
    37. static {
    38. // 静态代码块实现初始化
    39. for (EnumType value : EnumType.values()) {
    40. typeIndex.put(value.name(),value);
    41. }
    42. }
    43. private static EnumType enumType(String type){
    44. return typeIndex.get(type);
    45. }