在Java程序中,如果不知道在方法中如何处理里出现的异常对象,可在定义该方法时使用throws抛出该异常,把该异常提交给上级调用者者处理。
【语法格式】 throws 抛出异常。
[修饰符] 返回值类型 方法名(形参列表) throws 异常类A [,异常类B,...,异常类N] {
//方法体
}
throws 能抛出方法可能产生的多个异常。下面代码段show()方法没有使用try… catch…finally 语句处理第3、4行可能产生的异常,第1行方法声明处使用throws关键字抛出第3、4行可能产生的异常。
1 public void show() throws ArrayIndexOutOfBoundsException, NumberFormatException {
2 int [] arr= {5,1,3,9};
3 int x=arr [10]; //可能抛出 ArrayIndexOutOfBoundsException
4 int y=Integer.parseInt("abc123xzy");
//可能抛出 NumberFormatException
5 }
上面代码段第3、4行可能产生ArrayIndexOutOfBoundsException或者NumberFormatException,这两个异常是不受检查异常,如果不用try…catch…finally语句处理并且也不用throws抛出,程序仍然能通过编译。
异常传播链
方法之间的调用以及throws抛出异常,使异常的传播形成反向异常传播链。如果在抛出异常的方法中没有完全捕获异常(异常没被捕获,或异常被处理后重新抛出了新异常),那么异常将从发生异常的方法逐渐向外传播,首先传给该方法的调用者,该方法调用者再次传给其调用者……直至main 方法如果main方法依然没有处理该吴异常,JVM抛出该异常,打印异常跟踪栈信息,终止程序。
throw语句
throw new 异常类(参数); //抛出异常对象
下面代码段,程序没有产生任何异常,第6行throw语句抛出程序员主动创建的 RuntimeException异常对象,第7行捕获第6行抛出的异常对象。
1 public static void show() {
2 int[] arr = { 4,7,2,6};
3 int x;
4 try{
5 x = arr[2];
6 throw new RuntimeException("数组异常!"); //抛出创建的异常对象
7 } catch (RuntimeException e){ //捕获抛出的异常对象
8 System.out.println("捕获了创建的RuntimeException异常对象");
9 } finally {
10 }
11}
如果throw仅能抛出Java提供的标准异常对象,则失去了throw的价值。throw的主要作用是抛出程序员自定义的异常对象。
自定义异常
从继承关系来说,自定义异常类可以是任何标准异常类的子类,如果自定义异常类继承标准异常类,那么使用自定义异常的程序员因无法直观分辨异常类型而感到莫名其妙。
标准异常类都是Exception类或RuntimeException类的子类,自定义异常类一般继承 Exception类或 RuntimeException类。如果自定义异常类继承了Exception类,该自定义异常类就是受检查异常;如果自定义异常类继承了RuntimeException类,该自定义异常类就是不受检查异常。
[语法格式] 自定义异常。
class异常类名extends Exception (或RuntimeException) { //自定义异常类
public 异常类名(){ } //空构造方法
public 异常类名( String msg){ //自定义异常类
super( msg ); //调用父类构造方法
}
}
程序案例10-6演示了自定义异常。第1行自定义异常GenderException继承Exception类,该自定义异常是受检查异常;第10行判断sex是否满足要求,如果不满足要求,第12行 throw 主动抛出受检查异常GenderException对象,第9~15 行使用try.catch.finally语句进行处理。
[程序案例10-6]自定义异常。
1 class GenderException extends Exception { //继承 Exception,自定义异常是受
//检查异常
public GenderException(){}
public GenderException(String msg) {
4 super(msg);
5 }
6}
7 public class Demo1006{
8 public static void getSex(char sex){
9 try {
10 if (sex != '男' || sex!='女'
11 //主动抛出受检查异常对象,需要用try….catch…finally语句处理
12 throw new GenderException("性别为男或者女")
13 System.out.println("性别:"+ sex):
14 } catch (GenderException e){
15 } finally{}
16 }
17 }
23