一、认识异常
1.异常的概念
在
Java
中,将程序执行过程中发生的不正常行为称为异常。。比如之前写代码时经常遇到的:
1.
算术异常
System.out.println(10 / 0);
// 执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
2.
数组越界异常
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
3.
空指针异常
int[] arr = null;
System.out.println(arr.length);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
从上述过程中可以看 到,java中不同类型的异常,都有与其对应的类来进行描述。
2.异常的体系结构
异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:
从上图中可以看到:
1.
Throwable
:是异常体系的顶层类,其派生出两个重要的子类,
Error 和
Exception
2.
Error
:指的是Java虚拟机无法解决的严重问题,比如:
JVM
的内部错误、资源耗尽等,这种错误很少发生,典型代表:
StackOverflowError(栈溢出)
和
OutOfMemoryError(内存溢出),一旦发生回力乏术。
3.
Exception
:异常产生后程序员可以通过代码进行处理,使程序继续执行。我们平时所说的异常就是Exception。
3. 异常的分类
异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为
1. 编译时异常
在程序编译期间发生的异常,称为编译时异常,也称为受检查异常, 该异常必须要被捕获或者声明,否则无法运行。
class Person implements Cloneable{
public String name;
public Person(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) {
Person person1 = new Person("zhangsan");
Person person2 = (Person)person1.clone();
}
// 因为main方法没有使用throws CloneNotSupportedException,这个程序将不能运行,在编译时就会报错。后面会讲到throws
//或者下面这样写
class Person implements Cloneable {
public String name;
public Person(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}public static void main(String[] args) { //这里没有声明,但是捕获了
Person person1 = new Person("zhangsan");
try {
Person person2