throws
在Java标准库中的方法通常并没有处理异常,而是交由使用者来处理,如判断整数数据格式是否合法的Integer.parseInt()方法就会抛出NumberFormatException异常。
这是怎么做到的?看一下API文档中的方法原型:
public static int parseInt(String s)
throws NumberFormatException
就是这个“throws”关键字,如果字符串s中没有包含可解析的整数就会“抛出”异常。
使用throws声明的方法表示此方法不处理异常,而由系统自动将所捕获的异常信息“抛给”上级调用方法。
throws使用格式如下:
访问权限 返回值类型 方法名称(参数列表) throws 异常类
{
// 方法体;
}
上面的格式包括两个部分:一个普通方法的定义,这和以前学习到的方法定义模式没有任何区别;方法后紧跟“throws 异常类”,它位于方法体{}之前,用来检测当前方法是否有异常,若有,则将该异常提交给直接使用这个方法的方法。
package com.xy.exception;
public class Throws {
public static void main(String[] args) {
int[] arr = new int[5];
try {
setZero(arr, 10);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组超出绑定范围!");
System.out.println("异常:" + e);
}
System.out.println("end of main() method!");
}
private static void setZero(int[] arr, int index) throws ArrayIndexOutOfBoundsException {
arr[index] = 0;
}
}
【结果】
在上例中,定义了私有化的静态方法setZero(),用于将指定的数组的指定索引赋值为0,由于没有检查下标是否越界(当然,并不建议这样做,这里只是显示一个抛出方法异常的例子),所以使用throws关键字抛出异常,“ArrayIndexOutOfBoundsException”表明setZero()方法可能存在的异常类型。一旦方法出现异常,setZero()方法自己并不处理,而是将异常提交给它的上级调用者main()方法。而在main方法中,有一套完善的try-catch机制来处理异常。
throw
到现在为止的所有异常类对象全部都是由JVM自动实例化的,但有时用户希望能亲自进行异常类对象的实例化操作,自己手工抛出异常,那么此时就需依靠throw关键字来完成了。
与throws不同的是,可直接使用throw抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
throw语句的格式为:
throw 异常类型的实例;
执行这条语句时,将会“引发”一个指定类型的异常,也就是抛出异常。
public class Throw {
public static void main(String[] args) {
try {
throw new ArrayIndexOutOfBoundsException("\n我是个性化的异常信息:\n数组下标越界");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组超出绑定范围!");
System.out.println("异常:" + e);
}
}
}
【结果】
throw关键字的使用完全符合异常的处理机制,但是,一般来讲用户都在避免异常的产生,所以不会手工抛出一个新的异常类型的实例,而往往会抛出程序中已经产生的异常类实例。