Java 异常体系

2022-05-19  本文已影响0人  bowen_wu

Java 异常体系

Exception

Exception 异常体系就是在 return 语句之外为方法提供另外一种出口

Throwable

try catch finally

throw vs throws

catch 的级联与合并

级联

public static void main(String[] args) {
    try{
        throwCheckedException();
    } catch (FileNotFoundException e) {
        System.out.println("文件没找到");
    } catch (EOFException e) {
        System.out.println("文件已到达末尾");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

catch 错误的顺序按照从小到大的顺序排列

合并

Java 7+ 才有合并

public static void main(String[] args) {
    try{
        throwCheckedException();
    } catch (NullPointerException | IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalStateException | IllegalArgumentException e) {
        // 做点别的事情
    }
}

栈轨迹 & 异常链

排查问题最重要的信息,没有之一

class TestException {
    public static void main(String[] args) {
        try {
            processUserData();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static void processUserData() {
        int userId = 1;
        try {
            insetIntoDatabase();
        } catch (SQLException e) {
            throw new UserAlreadyExistException("插入 id 为" + userId + "的数据的时候发生了异常", e);
        }
    }

    private static void insetIntoDatabase() throws SQLException {
        throw new SQLException("重复的键值");
    }
}

class UserAlreadyExistException extends RuntimeException {
    public UserAlreadyExistException(String message, Throwable cause) {
        super(message, cause);
    }
}
Stack Trace & Caused by

异常抛出原则

异常的处理原则

  1. 本方法是否有责任处理这个异常? => 不要处理不归自己管的异常
  2. 本方法是否有能力处理这个异常? => 如果自己无法处理,就抛出
  3. 如非万分必要,不要忽略异常
    try {
        URLDecoder.decode("", "UTF-8");
    } catch (UnsupportedEncodingException ignored) {
        // 忽略异常
    }
    

JDK 内置异常

知识点

  1. IOException 通常代表预期之内的异常
上一篇下一篇

猜你喜欢

热点阅读