目录
一 、异常的基本概念
异常是导致程序中断运行的一种指令流
二 、为什么需要异常处理
之所以需要异常处理呢,是因为如果不对异常进行正确地处理,则可能导致程序的中断运行,带来一些不必要的麻烦。所以在程序的设计中必须考虑各种异常的发生,并正确地做好相应的处理,这样才能保证程序正常地执行
现有以下代码,被除数为0,程序运行中断,出现算数异常
public class ExceptionDemo01{
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
int i = 10 ; // 定义整型变量
int j = 0 ; // 定义整型变量
int temp = i / j ; // 此处产生了异常,程序中断,不再运行以下语句
System.out.println("两个数字相除的结果:" + temp) ;
System.out.println("********** 计算结束 ***********") ;
}
};
程序编译报错:
三 、在程序中进行异常处理
【异常处理格式】
try { //有可能出现异常的语句 }catch (异常类 异常对象){ //编写异常的处理语句 }catch (异常类 异常对象){ //编写异常的处理语句 }finally { //一定会执行到的程序代码 }
(1)程序在 try 中捕获到异常,就会自动跳转到 catch 语句中匹配duiy对应的异常类型进行相应的处理,最后程序是否产生异常,则肯定都会执行 finally 语句。
(2)finally 块是可以省略的,如果省略了 finally 块,则try-catch块后程序继续执行
【异常处理流程图】
对异常进行捕获处理:
public class ExceptionDemo02 {
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
int i = 10 ; // 定义整型变量
int j = 0 ; // 定义整型变量
try {
int temp = i / j ; // 此处产生了异常
System.out.println("两个数字相除的结果:" + temp) ;
}catch (ArithmeticException e){
System.out.println("异常信息:" + e);
}
System.out.println("********** 计算结束 ***********") ;
}
};
程序运行结果:
加入 fianlly 块:
public class ExceptionDemo02 {
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
int i = 10 ; // 定义整型变量
int j = 0 ; // 定义整型变量
try {
int temp = i / j ; // 此处产生了异常
System.out.println("两个数字相除的结果:" + temp) ;
}catch (ArithmeticException e){
System.out.println("异常信息:" + e);
}finally {
System.out.println("异常统一出口:不管程序是否有异常,都执行此代码");
}
System.out.println("********** 计算结束 ***********") ;
}
};
程序运行结果:
问题一:以上程序处理了一个异常,当然在程序的开发中一般不止存在一个异常,会同时产生多个异常,此时,就可以使用多个 catch 语句进行处理:
比如现在修改以上程序,加入 Integer.parseInt() 方法,对字符串参数进行转换,此时如果参数为非纯数字的字符串,程序就会出现 NumberFormatException 异常,如果参数为数字0,会出现 ArithmeticException 异常,此时可以使用多个 catch 语句分别处理不同的异常
public class ExceptionDemo02 {
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
try {
int i = Integer.parseInt("10") ;
int j = Integer.parseInt("a") ;
int temp = i / j ;
System.out.println("两个数字相除的结果:" + temp) ;
}catch (ArithmeticException e){
System.out.println("异常信息:" + e);
}catch (NumberFormatException e){
System.out.println("异常信息:" + e);
}
System.out.println("********** 计算结束 ***********") ;
}
};
程序运行结果:
问题二:使用多个catch语句可以分别处理多个不同的异常,但是在程序的开发过程中很难知道到底会有几个异常,那么该如何解决这个问题呢?
四 、异常类的继承结构
查看JDK文档可以发现,上面程序出现的异常ArithmeticException 、NumberFormatException 均是 Exception 的子类
而 Exception 是Throwable 的直接子类
Exception :一般表示的是程序中出现的问题,可以直接使用 try...catch 处理
Error:一般指 JVM 错误,程序中无法处理
了解了异常类的继承结构后,再了解一下Java的异常处理机制,两者结合,从中寻找上面问题二的解决方法
五 、Java的异常处理机制
【1】一旦产生异常,则首先会产生一个异常类的实例化对象
【2】在 try 语句中对此异常对象进行捕捉
【3】产生的异常对象与 catch 语句中的各个异常类型进行匹配,如果匹配成功,则执行 catch 语句中的代码
六 、使用 Exception 进行异常处理
从对象多态性可以发现,利用向上转型的概念,子类实例可以由父类接收,即所有的异常对象都可以使用 Exception 接收
使用 Exception 处理异常做法一:先对已知异常分别进行处理(实际开发有时需要对某个异常单独自定义处理),最后使用Exception捕获其它未知异常并处理:
注意:此处理方式的 catch 语句,范围小的异常(比如某个具体的异常)必须放在范围大的异常(比如Exception)之前,否则出现编译错误
提示:Exception 类中提供了一个 printStackTrace() 打印异常信息的方法
public class ExceptionDemo02 {
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
try {
int i = Integer.parseInt("10") ;
int j = Integer.parseInt("a") ;
int temp = i / j ; // 此处产生了异常
System.out.println("两个数字相除的结果:" + temp) ;
}catch (ArithmeticException e){
e.printStackTrace();
}catch (NumberFormatException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("********** 计算结束 ***********") ;
}
};
程序运行结果:
使用 Exception 处理异常做法二:所有异常使用Exception处理
public class ExceptionDemo02 {
public static void main(String args[]){
System.out.println("********** 计算开始 ***********") ;
try {
int i = Integer.parseInt("10") ;
int j = Integer.parseInt("0") ;
int temp = i / j ;
System.out.println("两个数字相除的结果:" + temp) ;
}catch (Exception e){ //使用Exception进行处理
System.out.println("异常信息:" + e);
}
System.out.println("********** 计算结束 ***********") ;
}
};
不管出现任何异常,统一使用 Exception 进行处理