throws关键字
在前面章节案例中,定义除法运算时,开发者通常会意识到可能出现的异常,可以直接通过try...catch对异常进行捕获处理,但有些时候,方法中代码是否会出现异常,开发者并不明确或者并不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。
在Java中,将异常抛出需要使用throws关键字来实现,该关键字用在会抛出异常的方法名称后,同时支持一次性抛出多种类型的异常,基本语法格式如下:
[修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1,异常类2,... {
// 方法体...
}
从上述语法格式中可以看出,throws关键字需要写在方法声明的后面,throws后面需要声明方法中发生异常的类型,通常将这种做法称为方法声明抛出一个异常。接下来对上一节案例进行修改,在devide()方法上声明抛出异常,如文件1所示。
文件1 Example31.java
1 public class Example31 {
2 // 下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常
3 public static int divide(int x, int y) throws Exception {
4 int result = x / y; // 定义变量result记录两个数相除的结果
5 return result; // 将结果返回
6 }
7 public static void main(String[] args) {
8 int result = divide(4, 0); // 调用divide()方法
9 System.out.println(result);
10 }
11 }
编译程序报错,结果如图1所示。
图1 运行结果
文件1中,在调用divide()方法时,由于该方法时声明抛出了异常,所以调用者在调用divide()方法时就必须进行处理,否则就会发生编译错误。从图1可以看出,Eclipse在程序编译时发生了“Unhandled exception type Exception(未处理的异常类型)”的问题,并且给出了两种快速解决的方案。其中“Add throws declaration”表示在方法上继续使用throws关键字抛出异常,而“Surround with try/catch”表示在出现异常的代码处使用try…catch代码块进行捕获处理。
下面对文件1进行修改,在调用divide()方法时对其进行try…catch捕获处理,如文件2所示。
文件2 Example32.java
1 public class Example32 {
2 // 下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常
3 public static int divide(int x, int y) throws Exception {
4 int result = x / y; //定义一个变量result记录两个数相除的结果
5 return result; //将结果返回
6 }
7 public static void main(String[] args) {
8 try {
9 int result = divide(4, 0); //调用divide()方法
10 System.out.println(result);
11 } catch (Exception e) { //对捕获到的异常进行处理
12 System.out.println("捕获的异常信息为:" + e.getMessage());
13 }
14 }
15 }
运行结果如图2所示。
图2 运行结果
文件2中,在调用divide()方法时,并没有对异常进行处理而是继续使用throws关键字将异常抛出。从运行结果可以看出,程序虽然可以通过编译,但在运行时由于没有对“/by zero”的异常进行处理,最终导致程序终止运行。