异常的分类
1. 编译时异常
在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)
public class Person {
int age;
private String name;
private String gender;
// 想要让该类支持深拷贝,覆写Object类的clone方法即可
@Override
public Person clone() {
return (Person) super.clone();
}
}
报错
我们会发现这段代码实际在IDEA写完后clone.()处会出现下划的红色波浪线
这表明在这个异常在编译时就会出错,前面几个异常源码写在IDEA里面是不会有下划线的所以前面的是运行时异常,而这个就是编译时异常,但是编译时异常是可以解决的,可以通过throws关键字解决
就像下面这样
public class Person {
int age;
private String name;
private String gender;
// 想要让该类支持深拷贝,覆写Object类的clone方法即可
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
如下图就没有报错了
2.运行时异常
在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception)RunTimeException
以及其子类对应的异常,都称为运行时异常。比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。
编译时出现的语法性错误,不能称之为异常。例如忘记写分号,这个也会出现下划线,但是这个不能称之为异常 此时编译过程中就会出错, 这是 “编译期” 出错。而运行时指的是程序已经编译通过得到class 文件了, 再由 JVM 执行过程中出现的错误.
异常的继承关系
异常既然是类,那么异常就是有继承关系的
如下图
- Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
- Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
- Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。我们平时所说的异常就是Exception。
java中所有的错误和异常均继承于Throwsable类,我们双敲shift进入搜索框,输入Throws类,如下图
![在这里插入图片描述](https://img-blog.csdnimg.cn/f083b757325147f181ffbefb491ad64b.png
双击Throwsable类就能找该类的定义
如图
Error 错误
比如说,我们在没有终止条件的递归中就会出现StackOverflowError
栈溢出错误
public class Test {
public static void func(){
func();
}
public static void main(String[] args) {
func();
}
}