学习目标
1:try catch 语句块和finally 关键字
2:异常中的捕获和处理
学习内容
一:try catch语句块和finally关键字
我们编译运行程序出错的时候,编译器就会抛出异常。抛出异常要比终止程序灵活许多,这是因为
Java提供了一个“捕获”异常的的处理器(处理器)对异常情况进行处理。
异常有两种类型:未检查异常和已检查异常。
对于已检查异常,处理器器将会检查是否提供了处理器。
然而有许多的异常,如:访问null引用,都属于未检查异常。编译器不会查看是否为这些错误提供了
处理器。
/ * try catch:自己处理异常
- try {
*可能出现异常的代码
*} catch(异常类名A e){
*如果出现了异常类A类型的异常,那么执行该代码
*} …(catch可以有多个) - finally {
*最终肯定必须要执行的代码(例如释放资源的代码)
*}
try关键字 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch关键字 用于捕获异常。catch用来捕获try语句块中发生的异常。
*代码执行的顺序: - 1.try内的代码从出现异常的那一行开始,中断执行
- 2.执行对应的catch块内的代码
- 3.继续执行try catch结构之后的代码
*注意点: - 1.如果catch内的异常类存在子父类的关系,那么子类应该在前,父类在后
- 2。如果最后中有返回语句,那么最后返回的结果肯定以最终中的返回值为准
- 3。如果最后语句中有回报,那么没有被处理的异常将会被吞掉
*异常类Api: - 1.getMessage():获取异常描述信息字符串
- 2.toString():返回异常类的包路径和类名和异常描述信息字符串
- 3.printStackTrace():除了打印的toString的信息外,还要打印堆栈信息
finally关键字:finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
package com.hg.demo01;
import java.io.IOException;
/**
*
* 1.如果try中出现了多个异常对象,那么可能使用了多个catch来进行异常处理
* 2.如果try中产生了异常,那么会执行catch中的异常处理逻辑,执行完catch中的异常逻辑继续执行try----catch之后的代码
* 如果try中没有产生catch,那么就不会执行catch中的异常逻辑,直接执行后续代码
*
* finally关键字
*
* 1.finally不能单独使用
* 2.finally一般用于资源释放(资源回收),无论程序是否出现异常,都要释放资源**/
public class Demo01TryCatch {
public static void main(String[] args) {
try {
readFile("D:\\a.txt");
}catch(IOException e){
//System.out.println("catch 文件后缀发生错误");
// System.out.println(e.toString()); 返回详细的异常消息包含了异常类型
// System.out.println(e.getMassage()); 返回简短的异常消息
e.printStackTrace();
}finally {
System.out.println("资源释放");
}
System.out.println("后续代码");
}
public static void readFile(String fileName) throws IOException {
if(!fileName.endsWith(".txt")) {
throw new IOException("文件后缀名不对");
}
System.out.println("没有发生异常");
}
}
结果为:
二:异常中的捕获和处理
多种异常处理方式
* 1.多个异常分别处理
* 2.多个异常一次捕获,多次处理
* 3.多个异常一次捕获,一次处理
package com.hg.demo01;
import java.rmi.AlreadyBoundException;
import java.util.List;
public class Demo02Exception {
public static void main(String[] args) {
/**
* 多个异常如何处理
* 1.多个异常分别处理
* 2.多个异常一次捕获,多次处理
* 3.多个异常一次捕获,一次处理**/
/**
* try{ int[] arr= {1,2,3};
//System.out.println(arr1[3]);
}catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
try{
List<Integer> list=List.of(1,2,3);
System.out.println(list.get(3));
}catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
* }**/
/**
* try{//一次捕获,多次处理
int[] arr1=null;
int[] arr= {1,2,3};
//System.out.println(arr1[3]);
List<Integer> list=List.of(1,2,3);
System.out.println(list.get(3));
}catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}catch(IndexOutOfBoundsException e) {
e.printStackTrace();
System.out.println(e);
}**/
try{
int[] arr1=null;//一次捕获,一次处理
int[] arr= {1,2,3};
//System.out.println(arr1[3]);
List<Integer> list=List.of(1,2,3);
System.out.println(list.get(3));
}catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
结果为:
2020080605041