为了保证程序有效地执行,需要对抛出的异常进行相应的处理。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,而后处理该异常,也可以将异常向上抛出,交由方法调用者来处理。本节将讲解Java中捕获异常的方法。
8.2.1抛出异常
异常抛出后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Integer类的parseInt()方法来实现。但如果该字符串不是数字形式,parselnt()方法就会抛出异常,程序将在出现异常的位置终止,不再执行下面的语句。
【例1】控制台输出"lili年龄是:20L"
在项目中创建Thundering类,在主方法中实现将不是数字形式的字符串转换为int型。运行程序,系统会报出异常提示。实例代码如下:
public class Thundering{ //创建类
public static void main(String[] args){ //主方法
String str = "lili"; //定义字符串
System.out.println(str+"年龄是:"); //输出的提示信息
int age = Integer.parselnt("20L"); //数据类型的转换
System.out.println(age); //输出信息
}
}
运行结果如下:lili年龄是:
Exception in thread"main"java.lang.NumberFormatException:For input string:"20L"
从中可以看出,本实例报出的是NumberFormatException(字符串转换为数字)异常。提示信息"lili年龄是"已经输出,可知该句代码之前并没有异常,而变量age没有输出,可知程序在执行类型转换代码时已经终止。
8.2.2捕捉异常
Java语言的异常捕获结构由try、catch和finally 3部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下:
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
通过异常处理器的语法可知,异常处理器大致分为try-catch语句块和finally语句块。
1.try-catch语句块
下面将例1中的代码进行修改。
【例2】捕获例1中主方法抛出的异常
在项目中创建Take类,在主方法中使用try-catch语句块将可能出现的异常语句进行异常处理。实例代码如下:
public class Take{ //创建类
public static void main(String[] args){
try{ //try语句块中包含可能出现异常的程序代码
String str = "lili"; //定义字符串变量
System.out.println(str+"年龄是:"); //输出的信息
int age = Integer.parselnt("20L"); //数据类型转换 System.out.println(age);
}catch (Exception e){ //catch语句块用来获取异常信息
e.printStackTrace(); //输出异常性质
}
System.out.println("program over"); //输出信息
}
}
运行结果如下:lili年龄是:
java.lang.NumberFormatException:For input string:"20L"
从中可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。在例2中,将可能出现异常的代码用try-catch语句块进行处理,当try语句块中的语句发生异常时,程序就会跳转到catch语句块中执行,执行完catch语句块中的程序代码后,将继续执行catch语句块后的其他代码,而不会执行try语句块中发生异常语句后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
误区警示:
有时为了编程简单会忽略catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在catch语句块中写入处理异常的代码。
2.finally语句块
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是,在以下4种特殊情况下,finally块不会被执行:
☑ 在finally语句块中发生了异常。
☑ 在前面的代码中使用了System.exit()退出程序。
☑ 程序所在的线程死亡。
☑ 关闭CPU。