当遇到异常时,除了可以将异常抛出,还可以将其捕获。抛出虽然简单,但是有时却不得不使用捕获来处理异常。如果程序遇到异常而没有捕获,则程序会直接退出。这在大多数情况下是不能被接受的,至少需要保存程序当前状态才能退出。本实例将演示如何捕获多个异常,实例运行效果如图


7.25.png

Java中捕获异常是通过trycatchfinally 3个块来完成的。其中try块是必需的,catchfinally块可以选择一个或两个。try块用来放置可能出现问题的语句,如果在try块中可能出现多个异常,则最好提供多个catch块来进行捕获。这样可以针对不同的异常提供不同的处理方案。如果try块中程序的异常和第一个catch块捕获的异常不匹配,JVM将比较第二个catch块,依此类推,直到出现匹配的为止。如果没有找到匹配的,异常对象将抛给调用该方法的方法。

编写类CatchExceptions,在该类的main()方法中演示了trycatchfinally块的用法。代码如下:

package com.mingrisoft.exception;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CatchExceptions {
    private static String URL = "jdbc:mysql://localhost:3306/db_database18";
    private static String DRIVER = "com.mysql.jdbc.Driver";
    private static String USERNAME = "mr";
    private static String PASSWORD = "mingri";
    private static Connection conn;
    
    public static Connection getConnection() {
        try {
            Class.forName(DRIVER);// 加载驱动程序
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 建立连接
            return conn;
        } catch (ClassNotFoundException e) {// 捕获类为发现异常
            e.printStackTrace();
        } catch (SQLException e) {// 捕获SQL异常
            e.printStackTrace();
        }
        return null;
    }
    
    public static void main(String[] args) {
        CatchExceptions.getConnection();
    }
}

说明:代码中首先捕获了ClassNotFoundException,然后是SQLException

心法领悟:捕获多个异常的使用。

对于可能抛出多个异常的代码块,可以不对每个异常都提供一个catch块进行处理。此时需要提供这些异常的父类,如Exception,使用catch块处理。当有多个catch块时,它们排列的顺序非常重要。一定要让异常的范围按从小到大排列。在相同继承层次的可以不考虑排列顺序。