1. 异常的产生
异常是导致程序中断的一种指令流,异常一旦产生并且没有进行合理处理的话,那么程序就将中断执行。
范例:产生异常的代码
public class TestDemo{
public static void main(String args[]){
System.out.println("1.除法计算开始。");
System.out.println("2.除法计算:"+ (10 / 0));//此处产生异常
System.out.println("3.除法计算结束。");
}
}
运行结果:
1.除法计算开始。
Exception in thread "main" java.lang.ArithmeticException: / by zero
at TestDemo.main(TestDemo.java:5)
我们发现:一旦异常之后发现产生异常的语句及之后的语句不再执行,默认情况下是进行异常信息的输出,而后自动结束程序的执行。
2.异常的处理
Java之中提供了三个关键字:try, catch, finally。
三个关键字的使用语法如下:
try {
//有可能出现异常的语句
}catch(异常类型 对象){
//异常处理
}catch(异常类型 对象){
//异常处理
}...finally{
//不管是否出现异常,都执行的统一代码
}
对于以上的操作组合有: try...catch, try...catch...finally, 和 try...finally。
应用异常处理流程图如下
三个关键字的使用语法如下:
try {
//有可能出现异常的语句
}catch(异常类型 对象){
//异常处理
}catch(异常类型 对象){
//异常处理
}...finally{
//不管是否出现异常,都执行的统一代码
}
对于以上的操作组合有: try...catch, try...catch...finally, 和 try...finally。
应用异常处理流程图如下
1. 当程序在运行的过程中出现了异常之后,那么会由JVM自动根据异常的类型实例化一个与之类型匹配的异常类对象(此处用户不用关心new,系统自动处理);
2. 产生了异常对象之后,会判断当前的语句上是否存在异常处理,如果没有异常处理,那么就交给JVM进行默认的异常处理,处理的方式:输出异常信息,而后结束程序的调用;
3. 如果此时存在有异常的捕获操作,那么会由try 语句来捕获产生的异常类实例化对象,而后与
try语句后的每一个catch比较,如果有符合的捕获类型,则使用当前的catch语句来进行处理,如果不匹配,则向下继续匹配其他的catch;
4. 不管能不能够匹配,那么都要向后执行,如果程序中存在有finally语句,就先执行finally中的代码,但是执行完毕后,就需要根据之前的catch匹配结果来决定如何执行,如果之前已经成功的捕获了异常,就继续执行finally之后的的代码,如果之前没有成功的捕获异常,那么就将此异常交给JVM进行默认处理。
2. 产生了异常对象之后,会判断当前的语句上是否存在异常处理,如果没有异常处理,那么就交给JVM进行默认的异常处理,处理的方式:输出异常信息,而后结束程序的调用;
3. 如果此时存在有异常的捕获操作,那么会由try 语句来捕获产生的异常类实例化对象,而后与
try语句后的每一个catch比较,如果有符合的捕获类型,则使用当前的catch语句来进行处理,如果不匹配,则向下继续匹配其他的catch;
4. 不管能不能够匹配,那么都要向后执行,如果程序中存在有finally语句,就先执行finally中的代码,但是执行完毕后,就需要根据之前的catch匹配结果来决定如何执行,如果之前已经成功的捕获了异常,就继续执行finally之后的的代码,如果之前没有成功的捕获异常,那么就将此异常交给JVM进行默认处理。
观察代码:
public class TestDemo{
public static void main(String args[]){
System.out.println("1.除法计算开始");
try {
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
System.out.println("2.除法计算:" + x/y);
System.out.println("############");
} catch (Exception e){
e.printStackTrace();
} finally{
System.out.println("### 不管是否出现异常都执行");
}
System.out.println("3. 除法计算结束。");
}
}
编译后执行java TestDemo 10 0
执行结果:1.除法计算开始
java.lang.ArithmeticException: / by zero
at TestDemo.main(TestDemo.java:7)
### 不管是否出现异常都执行
3. 除法计算结束。
注意:在编写多个catch捕获异常的时候,捕获范围大的异常一定要放在捕获异常小的后面,如果上述代码加上catch(ArithmeticException e)就必须放在Exception前面 ;
虽然直接捕获Exception比较方便,这样所有的异常都按照同样的方式进行处理,在一些要求严格的项目,异常一定要分开处理。