异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。简单来说就是程序在运行时的时候,发生的不正常事件,就是所谓的异常。
异常,:在 Java 中都是以类, 进行体现的。
异常体系:
Throwable:可抛出异常
Error:系统级别问题,JVM退出等,代码无法控制。
Exception:java.lang包下,称为异常类,他表示程序本身可以处理的问题。
RuntimeException:运行时异常,在编译阶段是不会报错的。(例如:空指针异常、数组索引越界异常)。
非RuntimeException:编译时异常,编译阶段报错提醒,必须处理,不然不会通过编译(日期格式化异常)。
异常的分类 :
编译时异常 ( 受检异常 ): 编译期间 ,代码格式, 语法全部没有错误, 但就是出现了红色波浪线。这是因为代码有可能会错误,
解决方法:抛出异常或捕获异常。
运行时异常:编译过了, 运行错了。重点 : 在Exception下, RuntimeException 和其子类, 都是运行时异常, 反之, 都是编译时异常。
Java 默认处理异常的方式(报错) :
1. 虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
3. 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
4. 直接从当前执行的异常点干掉当前程序。
5. 后续代码没有机会执行了,因为程序已经死亡。
异常处理方法:
try...catch :
介绍 :
try...catch 的方式就是捕获异常。
捕获异常:Java中对异常有针对性的语句进行捕获
格式:
try{
可能会出现错误的代码.......
}catch(要捕获的异常类 变量名){ //异常类可自定义(必须自己先写类)
捕获到之后,编写异常的处理方式 //也可以是异常对象方法
}
try...catch...finally:
finally:常规情况下 finally 代码块中的代码, 是一定要执行的 !!!
try...catch ....catch.....catch....
1. 可以使用多个catch捕获异常, 但是父类的异常要放在最后
2. 多个异常直接, 也可以使用 | 进行隔开
抛出异常Thorw
有些异常, 我们自己是不能处理的, 应该将问题暴露给使用者,这时候就需要将问题抛出。
public void setAge(int age) throws Exception { if(age>=1&&age<=120){ this.age = age; }else { //不满足上面情况就抛出异常 throw new Exception("请输入1-120之间的整数年龄"); } }
1.在类名后他声明异常类(thiows 异常类)
2.在代码中抛出异常(throw new 异常类)
重点理解 : throw 和 throws 的区别 :
throws : 声明异常的, 告知方法的调用者, 我这个方法里有异常,你调用的时候, 需要准备好应对方案。
throw : 干力气活的, 抛出异常对象
细节 : 如果抛出的是 RunTimeException 或者其子类, 就不需要 throws 声明
注意事项:
1. 子类不能抛出父类没有的, 或者比父类大的异常
2. 父类方法没抛异常, 子类重写父类方法, 如果有异常, 只能 try
自定义编译时异常(作用”:编译时异常是编译时提示报错):
定义一个异常类来继承Exception
自定义异常 :
自定义编译时异常(作用”:编译时异常是编译时提示报错):
定义一个异常类来继承Exception
重新构造器
在出现异常的地方用throw new 自定义对象 抛出
自定义运行时异常(作用:编译时不提醒不报错,在运行时才可能报错):
定义一个异常类来继承RuntionException
重新构造器
在出现异常的地方用throw new 自定义对象 抛出