JavaSE01_Day05(上)-异常处理概述、异常的捕获和处理、Exception常用API
一、异常处理概述
1.1 定义
异常指代的是程序运行的过程中发生了无法继续执行代码的情况,我们就称之为异常(异于平常,和正常情况不一样)。
1.2 异常处理机制
当程序中出现异常以后,对程序的一个补救措施,防止程序出错以后无法继续进行执行后续代码,导致程序瘫痪。
1.3 异常分类
二、异常的捕获和处理
2.1 try-catch
try{
//可能会发生异常的代码片段
String str = null;
str.length();
}catch(NullPointerException e){//子类异常
//捕获空指针异常,并进行代码片段的处理
}catch(ClassNotFoundExecption e){//子类异常
//捕获类加载不到异常,并进行代码片段的处理
}catch(FileNotFoundExecption e){//子类异常
//捕获文件加载不到异常,并进行代码片段的处理
}catch(Execption e){//父类异常
//捕获Execption异常,防止程序在执行的过程中发生了上面没有进行捕获的异常,从而避免了程序的瘫痪。
}
注意事项:
try-catch块中try块中是对代码片段发生异常的一个捕获
try-catch块中catch块中是对发生异常后的一个处理
try-catch块可以存在多个catch块
catch块中对于异常的类型书写需要满足子类型在上,父类型在下,如果没有按照这个书写代码会编译报错。
2.2 try-catch代码片段
package cn.tedu.exception;
/**
* try-catch块案例演示
* @author cjn
*
*/
public class TryCatchDemo {
public static void main(String[] args) {
//1.定义可能会发生报错的代码片段
//2.使用try-catch语句块进行捕获处理
try {
String str = null;
str.length();
Integer.parseInt(str);
str.charAt(10);
} catch (StringIndexOutOfBoundsException e) {
System.err.println("虽然程序出现了字符串下标越界异常,但是不影响我程序的继续执行!!!");
} catch (NumberFormatException e) {
System.err.println("发生了数字格式化异常,但是不影响我程序的继续执行!!!");
} catch (Exception e) {
System.err.println("由父类异常捕获出错的场景");
}
/*
* 当对象为null时,调用属性及其方法会报空指针异常
*/
System.out.println("程序执行完毕!!!");
}
}
注意:
-
System.out.println();使输出的内容为黑色字体
-
System.err.println();会使输出的内容变为红色字体
-
当上面两条语句同时存在时,输出的先后顺序每次可能不一样,这是因为多线程的缘故,输出的先后顺序并不影响最终结果!!!
2.3 try-catch-finally块
语法结构:
try{
}catch(子类异常){
}catch(父类异常){
}finally{
//无论try中的代码片段是否会抛出异常,都会进行执行finally块中的代码逻辑,也就是当整个业务中有必须要进行执行的代码片段时,把这段逻辑写到finally块中
}
应用场景:
比如关闭打开的文件资源,或者有需要删除在程序执行过程中生成的临时文件等,我们需要把这些代码逻辑写到finally块中。
代码片段:
package cn.tedu.exception;
/**
* try-catch-finally块的案例应用
* @author cjn
*
*/
public class TryCatchFinallyDemo {
public static void main(String[] args) {
try {
String str = null;
str.length();
} catch (NullPointerException e) {
System.err.println("空指针异常发生!!!");
} catch (Exception e) {
System.err.println("不知道是什么异常,反正有个异常!!!");
} finally {
System.out.println("finally块中的代码逻辑执行了!!!");
}
}
}
测试步骤:
-
在catch块后方添加finally语句块,然后执行程序
-
修改字符串的赋值,不为null,然后执行程序
-
把catch块添加到try块后方,catch块前方,查看程序是否编译报错
结论:
finally块需要添加到try块后方,如果try块后有catch块,一定要添加到最后一个catch块的后方,catch块可以不存在。
System.exit(0);:当程序终止时,可以不执行finally块里的代码逻辑,一般不会手动终止程序,这条语句前一般不要有异常发生。
测试代码:
public static void main(String[] args) {
try {
String str = "111";
System.exit(0);
str.length();
} finally {
System.out.println("finally块中的代码执行了");
}System.out.println("执行完毕!");
}测试结果:无任何输出
2.4 经典场景应用
package cn.tedu.exception;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 使用try-catch-finally进行关闭资源案例
* @author cjn
*
*/
public class AutoCloseDemo {
public static void main(String[] args) {
/*
* 在jdk1.7以后提供了自动关闭资源的功能,使用的时候把资源的创建添加到try后面,
* 并且用()括起来,当资源对象使用完毕以后会自动的进行调用close方法关闭资源,
* 该方案也是以后工作中经常使用的方案。
*/
try (
FileOutputStream fos = new FileOutputStream("execption.txt");
){
fos.write(97);
} catch (FileNotFoundException e) {
System.err.println("文件加载不到异常!!!");
} catch (Exception e) {
System.err.println("不知道是什么异常,反正有错!!!");
}
}
}
三、Exception常用的API
异常类中提供了两个常用的API方法,其中,getMessage()
可以查看错误信息,是以字符串的形式进行返回的,所以当你要调用该方法进行查看错误信息时,需要在输出语句中进行调用该方法打印输出。另一个方法printStackTrace()
,该方法可以详细的打印错误的堆栈信息。
package cn.tedu.execption;
/**
* 异常常用API案例演示
* @author cjn
*
*/
public class ExceptionAPIDemo {
public static void main(String[] args) {
try {
String[] strs = {"123","456","789","零"};
for (int i = 0; i < strs.length; i++) {
Integer.parseInt(strs[i]);
}
} catch (NumberFormatException e) {
System.err.println(e.getMessage());
} catch (Exception e) {
//打印错误的堆栈信息
e.printStackTrace();
}
}
}
输出结果:
//1.System.err.println(e.getMessage());
For input string: "零"
//2.e.printStackTrace();
java.lang.NumberFormatException: For input string: "零"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at cn.tedu.exception.ExceptionAPIDemo.main(ExceptionAPIDemo.java:9)
//3.不捕获异常时,报错
Exception in thread "main" java.lang.NumberFormatException: For input string: "零"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at cn.tedu.exception.ExceptionAPIDemo.main(ExceptionAPIDemo.java:9)