异常处理的两种方式

 

一、使用throws关键字,声明异常,交给方法的调用者处理,最终交个JVM处理(中断处理)

JVM中断处理,后面的后续代码就不会执行了。
throws使用格式:
当一个方法抛出了异常,就在方法声明时使用throws关键字,将异常交给方法调用者处理

修饰符 返回值类型 方法名(参数列表) throws AAAException, BBBException {
    //method body
}

注意:1、如果throws的多个异常是子父类关系,那么就只用声明父类
2、调用了声明异常的方法,那么就必须处理这些声明的异常,要么是继续throws,交给别人处理,要么就try...catch自己处理

package cn.zhuobo.day12.aboutException;

import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo01Throws {
    public static void main(String[] args) throws IOException {// main调用了声明异常的方法,可以选择继续声明异常,继续抛出异常给main的调用者也就是JVM处理
        readFile("c:a.taxt");
    }
// 这是这三个异常的继承关系:FileNotFoundException extends IOExcetion Exception,因此抛出了两个异常就只用声明父类异常
    public static void readFile(String fileName) throws IOException {
        if(!fileName.equals("c:a.txt")) {
            throw new FileNotFoundException("文件路径不是c:a.txt");
        }
        if(!fileName.endsWith(".txt")) {
            throw new IOException("后缀名不是txt");
        }
        System.out.println("读取文件");// 如果不符合抛出异常的条件,那么就执行这句话
    }
}

二、异常的第二种处理方式,捕获异常try......catch

格式:

try {
    可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象) {
    异常的处理逻辑,接收异常对象之后怎么处理异常,一般在工作中
    会把异常记录到一个日志中
}
...// 多个catch
catch(异常类名 变量名) {
    try可能抛出多个异常,可以使用多个catch
}finally {
            System.out.println("这里的代码无论是否出现异常都会执行,一般用于资源回收");
            //  finally代码块不能单独使用,和try catch一起使用
            // 如果finally代码块里有return语句,那么永远返回finally中的结果,应该避免在finally中写return语句
}

后续代码

注意
1、try可能回抛出多个异常对象,可以使用多个catch处理这些异常
2、try产生了异常就执行相对应的异常处理逻辑,之后继续执行后续代码
3、没有产生异常就不执行catch,执行完try后,执行后续代码

package cn.zhuobo.day12.aboutException;

import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo02TryCatch {
    public static void main(String[] args) {//这里没有throws声明抛出异常
        try {
            // 可能产生异常的代码
            readFile("sss");
        }catch (IOException e) {// try里抛出什么异常对象,catch就声明什么异常变量,接收抛出的异常
            // 异常的处理逻辑
            System.out.println("后缀名不是txt");
        }
        //与throws不同的是,自己try catch处理异常,不是交个方法调用这JVM处理,就不会中断处理,后续代码可以继续执行
        System.out.println("这些都是后续的代码");
    }

    public static void readFile(String fileName) throws IOException {// 如果结尾不是txt,这个方法会产生一个异常对象
        if(!fileName.endsWith(".txt")) {
            throw new IOException("后缀名不是txt");
        }
    }
}

三、Throwable类中定义了三个异常处理方法

String getMessage():返回此 Throwable 的简短描述
String toString():返回此 Throwable 的详细消息字符串
void printStackTrace():JVM打印异常对象,默认使用这个方法,这是最详细的异常信息

// 可以在catch使用这三个方法,打印异常信息

catch (IOException e) {// try里抛出什么异常对象,catch就声明什么异常变量,接收抛出的异常
            // 异常的处理逻辑
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            e.printStackTrace();
        }

Output:异常信息一个比一个详细

后缀名不是txt// getMessage
java.io.IOException: 后缀名不是txt// toString
java.io.IOException: 后缀名不是txt// printStackTrace
	at cn.zhuobo.day12.aboutException.Demo02TryCatch.readFile(Demo02TryCatch.java:23)
	at cn.zhuobo.day12.aboutException.Demo02TryCatch.main(Demo02TryCatch.java:10)
上一篇:缓冲流、转换流、序列化流


下一篇:【无标题】一本书读懂人工智能