1.认识异常
异常是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。
范例:不产生异常的代码
package cn.kuiba.util;
public class Main {
public static void main(String args[]){
System.out.println("【1】****程序开始执行****");
System.out.println("【2】****数学计算:"+(10/2)); //执行除法计算
System.out.println("【3】****程序执行完毕****");
}
}
执行结果:
【1】****程序开始执行****
【2】****数学计算:5
【3】****程序执行完毕****
范例:产生异常的代码
package cn.kuiba.util;
public class Main {
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 cn.kuiba.util.Main.main(Main.java:6)
在第二个程序中有数学异常(“10/0”的计算将产生ArithmeticException异常),由于程序没有进行异常处理,所以默认异常信息打印,终止执行异常产生之后的代码。 出现异常,没有正确地吹异常,程序会中断执行。所以要引入异常处理语句来完善。
2.异常处理
在Java中,针对异常处理提供有三个关键字:try、catch、finally,利用这几个关键字就可以组成如下的异常处理格式。
try{
//有可能出现异常的语句
}[catch(异常类型 对象){
//异常处理;
}catch(异常类型 对象){
//异常处理;
}catch(异常类型 对象){
//异常处理;
}...][finally{
;//不管是否出现异常,都执行的统一代码
}]
在格式中已经明确表示,在try语句中捕获可能出现的异常代码。如果在try中产生了异常,则程序会自动跳转到catch语句中找匹配的异常类型进行相应的处理。最后不管程序是否产生异常,则肯定会执行到finally语句,finally语句就作为异常的统一出口。finally块时可以省略的。如果finally块写,则在catch()块执行结束后,程序将继续向下执行。
提示:异常的格式组合 在以上格式中发现catch与finally都是可选的,实际上这并不是表示这两个语句可以同时消失,对于异常格式的组合,往往有以下几种结构形式:try...catch、try...catch...finally、try...finally。
范例:异常处理
package cn.kuiba.util;
public class Main {
public static void main(String args[]){
System.out.println("【1】****程序开始执行****");
try {
System.out.println("【2】****数学计算:" + (10 / 0)); //执行除法计算
}catch (ArithmeticException e){ //捕捉常数异常
System.out.println("【c】处理异常:"+e); //处理异常
}
System.out.println("【3】****程序执行完毕****");
}
}
执行结果
【1】****程序开始执行****
【c】处理异常:java.lang.ArithmeticException: / by zero
【3】****程序执行完毕****
本程序使用了异常处理语句格式,当程序中数学计算出现异常后,异常会被try语句捕捉,而后交给catch处理,这个时候程序正常结束,不会中断执行。 以上处理,只能以提示信息的方法处理异常,不能明确描述异常类型。为了解决异常,可以使用异常类中提供的printStackTrace()方法进行异常信息的完整输出。
范例:获取完整异常信息
package cn.kuiba.util;
public class Main {
public static void main(String args[]){
System.out.println("【1】****程序开始执行****");
try {
System.out.println("【2】****数学计算:" + (10 / 0)); //执行除法计算
}catch (ArithmeticException e){ //捕捉常数异常
e.printStackTrace(); //输出异常信息
}
System.out.println("【3】****程序执行完毕****");
}
}
执行结果:
【1】****程序开始执行****
【3】****程序执行完毕****
java.lang.ArithmeticException: / by zero
at cn.kuiba.util.Main.main(Main.java:7)
所有的异常类中都会提供有printStackTrace()方法,而利用这个方法输出的异常信息,会明确地告诉用户异常出现在第几行,以便进行代码的调试与异常排除。 除了使用try...catch的异常处理结构之外,也可以使用try...catch...finally异常处理结构,利用finally块作为程序执行出口,不管是否有异常都会执行此代码。
范例:使用finally语句
package cn.kuiba.util;
public class Main {
public static void main(String args[]){
System.out.println("【1】****程序开始执行****");
try {
System.out.println("【2】****数学计算:" + (10 / 0)); //执行除法计算
}catch (ArithmeticException e){ //捕捉常数异常
e.printStackTrace(); //输出异常信息
}finally { //最终出口,必然执行
System.out.println("【F】不管是否出现异常,我都会执行。");
}
System.out.println("【3】****程序执行完毕****");
}
}
执行结果:
【1】****程序开始执行****
【F】不管是否出现异常,我都会执行。
【3】****程序执行完毕****
java.lang.ArithmeticException: / by zero
at cn.kuiba.util.Main.main(Main.java:7)
本程序增加了一个finally语句,不管是否有异常,都会执行finally语句。