1.多个catch块
当我们对一段代码进行异常处理的时候会发现,有可能出现很多不同类型的异常,单靠一个异常处理不能解决问题
所以我们需要提供多个catch语句块分别对异常进行处理:
例如:
import java.io.IOException;
public class ExceptionTryCatchTest {
public void doSomething() throws IOException{
System.out.println("do somthing");
}
public static void main(String[] args){
ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
try {
etct.doSomething();
} catch (Exception e) {
} catch (IOException e) {
}
}
}
2.finally语句:
使用finally语句块可以保证不论try语句块中是否出现异常,finally语句块中的代码都会被执行。
例如:
3.异常使用注意事项
(1)异常的捕获顺序;在前面介绍了异常捕获时提过,catch语句后的异常类型必须是与try语句块中抛出的异常的类型一致,
或者是抛出异常类型的父类,catch语句块中的代码才会被执行。如果try语句块中抛出一个异常,而多个catch语句后声明捕获
的异常类型,分别是这个抛出的异常类型和这个抛出的异常类型的父类(包括父类的父类),则这些catch语句都能捕获并处理这个异常,程序如何运行?
例如:
public class Text{
public static void main(String[] args)
{
try{
String teacher[]={"柳海龙","孙传杰","孙悦"};
for(int i=0;i<4;i++){
System.out.print(teacher[i]);
}
}catch(RuntimeException e){
System.out.print(""发生运行时异常,成功捕获!);
}catch(ArrayIndexOutOfBoundsException e){
System.out.print("发生数组下标越界异常,成功捕获!");
}catch(Exception e){
System.out.print("发生异常,成功捕获!");
}finally{
System.out.print("显示完毕!");
}
}
}
输出结果:
柳海龙
孙传杰
孙悦
发生数组下标越界异常,成功捕获!
显示完毕!
捕获顺序“从小到大”:即,先查子类然后查其父类,避免了父类大的异常捕获了,导致对子类的小异常无法进行捕获的情况。
4.异常对象
针对捕获的不同类型的异常,都获取了该异常的对象。即,catch(异常类型 变量名)语句括号里右边的变量名为异常类对象名
常用的异常对象的方法有两个:一个是:printStackTrace(),用于输出异常的堆栈信息,其中堆栈信息包括程序运行到当前类的
执行流程,显示方法调用序列;另一个方法是:getMassage(),用于返回异常详细信息的字符串。
例如:
public class Text{
public static void main(String[] args)
{
try{
String teacher[]={"柳海龙","孙传杰","孙悦"};
for(int i=0;i<4;i++){
System.out.print(teacher[i]);
}catch(ArrayIndexOutOfBoundsException e){
Syste.out.print("调用异常对象getMassage()方法:")
System.out.print(e.getMassage());
System.out.print("调用异常对象的printStackTrace()方法");
e.printStrackTrace();
}finally{
System.out.print("显示完毕!");
}
}
}
结果:
柳海龙
孙传杰
孙悦
调用异常对象的getMassage()方法:
3
调用异常对象的printStackTrace()方法:
java.lang.ArrayIndexOutOfBoundsException:3
at Test.main<Test.java:8>
显示完毕!
5.常见的异常
1.ArithmeticException 算数异常--如最常见的除数为0
2.ArrayindexOutOfBoundsException 数组下标越界异常,但需要遍历数组时,用foreach或者ArraryList可避免此异常。
3.ClassCastException 强制转换异常
4.ClassNotFoundException 找不到指定类异常,此类异常常发生于以下几种情况,
如:Class类中的forName方法
ClassLoader类中的findSystemClass方法
ClassLoader类中的loadClass方法
5.NullPointException 空指针异常,当应用程序试图在需要对象的地方使用null时,抛出此异常:
如:调用null对象的实例方法
访问或修改null对象的字段
将null作为一个数组,获得其长度
将null作为一个数组,访问或修改其元素值
将null作为Throwable值抛出
要避免此类异常可在定义引用类型变量就对其初始化,或者在使用此变量进行是否为空判断。
6.ArrayStoreException 数组存值异常--即元素类型不一致时抛出此异常,但若数组引用类型为Object则不会抛出此异常。
三、其他常见异常
1.IllegalAccessExcetion 非法访问异常--是当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,
或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时
抛出的异常。
此异常最常见是在有安全管理器下使用反射设置私有域的值。此时必须要使用setAccessible()修改
其可见性。一般而言,尽量避免使用反射来访问私有域。
2.FileNotFoundException 文件未发现异常--在试图打开指定路径名表示的文件失败时抛出的异常。在不存在具有指定路径
名的文件时,该异常有FileInputStream、FileOutputStream和ReadomAccessFile构造方法抛出。
若此文件存在,却由于其他原因不可访问,将抛出此异常。如打开一个只读文件进行写入。
要避免此类异常,可先通过File类的exists()方法来判断此文件是否存在。也可使用文件选择器,把
可操作的文件均罗列出来。
3.SqlException 数据库异常--提供关于数据库访问错误或其他错误信息的异常。通过此异常可知道:
a.描述错误的字符串;
b."SQLstate"字符串,该字符串遵守XOPEN SSQLstate约定或SQL:2003约定
c.特定于每个供应商的整数错误代码。
d.到下一个Exception的链接
e.因果