- 异常捕获,其本质就是程序员希望有一个if...else代码块,可以将影响程序运行的情况包括进去:
if(发生了影响程序运行的事件){
执行处理该事件的应对方法
}else{
程序正常运行
}
由此,我们就可以有对异常捕获的基本认识
- java中异常捕获和处理可以用try..catch代码块来实现,把可能发生异常的代码放在try中,一单代码发生异常,系统就会跑出一个异常对象,并且把这个异常对象交由catch代码块来处理。
- 应该注意的细节:
- 无论是try还是catch代码块,其花括号{}在任何情况下都是不可省略的,这一和if不同,if在执行的代码只有一行的时候可以省略花括号,try和catch不行
- 在try中声明的变量,只有在try代码块中才可以使用,在catch中是不可以使用的。
- 一个try可以对应多个catch,系统会根据抛出来的异常一次匹配这些异常,直到怕匹配到抛出的异常种类和catch的异常种类相同或者抛出的异常是catch的异常的子类异常时停下,并执行对应的catch的代码逻辑
- 常用的异常捕获种类有:
- IndexOutOfBoundsException:数组越界异常,java运行时将调用(比如说声明了长度为2的数组a,却使用了a[2]的时候)
- NumberFormatException:数字格式异常,当输入的是字母而不是一个数字的时候调用
- ArithmeticException:算术异常,当分母为零的时候调用
- NullPointException:空指针异常,当视图调用一个bull对象的实例方法或者实例变量的时候调用
- 在java7之后,可以使用一个catch块来捕获一种以上的异常,使用方法是在两个异常类名之间加 | 来分割
- 以下为上述知识点的代码示例
//需要注意的是,try和catch的{}是不能省略的,即使花括号里面只有一行代码
//还有,try中声明的变量只有在try中可以使用,在catch是不可以使用的
package KnowIt;
import java.rmi.server.ExportException;
import java.util.EmptyStackException;
public class SimpleExample {
public static void main(String args[]){
int a[] = new int[2];
a[0] = 1;
try {
int test = 12;
a[2] = 9;
}catch (NumberFormatException | IndexOutOfBoundsException e1){
// 这个异常是当输入的参数不是数字,而是字母的时候调用(也就是需要一个数字,却输入了一个字母)
// test = 1;
// 这一句是会报错的,因为catch无法访问try声明的变量
System.out.println("数字格式异常或者数组越界异常");
}catch (ArithmeticException e2){
// 这个异常是当分母为零的时候调用
System.out.println("算术异常");
}catch (EmptyStackException e3){
// 这个异常是当数组越界的时候调用
// System.out.println("数组越界异常");
// 程序最终输出数组越界异常,说明java是依次匹配各个捕获的异常,知道找到类型匹配的异常就
// 停下
}catch (Exception e4){
// 所有异常的父类
System.out.println("异常");
}
}
}
//输出结果为
// 数字格式异常或者数组越界异常
//空指针异常发生在视图调用一个null对象的实例方法或者实例变量的时候
package KnowIt;
import java.util.Date;
public class NullPointException {
public static void main(String args[]){
Date d = null;
try{
System.out.println(d.after(new Date()));
}catch (NullPointerException ne){
System.out.println("空指针异常");
}catch (Exception e){
System.out.println("未知异常");
}
}
}
这是我看李刚编著的《疯狂Java讲义》后总结出来的。