一、异常
1、定义
在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。
2、异常的结构
3、异常的分类
1)错误Error:应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,指虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等2) 受控异常: 这种异常属于一般性异常,出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过。编译器强制普通异常必须try…catch处理,或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。3)非受控异常:非受控异常也即是运行时异常(RuntimeException),这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明
4、异常的处理
捕获处理 :try--catch抛出处理 :throws throw
5、异常的捕获处理
try {} catch (OneException e) {} catch (TwoException e) {} finally {}
6、异常的抛出处理
throws会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理,JVM然后中断处理throw 和 throws 的区别?throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。throw一般用于抛出自定义异常。throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。throws表示出现异常的一种可能性,并不一定会发生这种异常。
7、异常的捕获顺序
异常的捕获:一般按照由小到大的顺序,也就是先截获子异常,再截获父异常例如:将IOException放到前面,会出现编译问题,因为IOException是FileNotFoundException的父类,所以截获了IOException异常后,IOException的子异常都不会执行到,所以再次截获FileNotFoundException没有任何意义
8、getMessage()和printStackTrace()
获取异常描述信息使用异常对象的getMessage()方法,通常用于打印日志时取得异常的堆栈信息使用异常对象的printStackTrace()方法,比较适合于程序调试阶段
二、自定义异常
1、定义
1)前面所讲的异常,都是系统自带的,系统自己处理2)但是很多时候项目会出现特有问题,而这些问题并未被java所描述并封装成对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义异常封装。3)在Java中要想创建自定义异常,需要继承Throwable或者他的子类Exception。
2、语法
class 自定义异常类 extends 异常类型(Exception){// 因为父类已经把异常信息的操作都完成了,所在子类只要在构造时,将异常信息传递给父类通过super 语句即可。// 重写 有参 和 无参 构造方法}
3、例子
package com.jbrh.pojo;
public class DiYiException extends Exception {
//无参构造方法
public DiYiException(){
super();
}
//有参的构造方法,用于存储自定义异常信息
public DiYiException(String message){
super(message);
}
// 用指定的详细信息和原因构造一个新的异常
public DiYiException(String message, Throwable cause){
super(message,cause);
}
//用指定原因构造一个新的异常
public DiYiException(Throwable cause) {
super(cause);
}
}
4、第一种自定义测试
package com.jbrh.pojo;
/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {
//方法一:声明异常数据,并用throws抛出
// public void say() throws DiYiException{
//
// throw new DiYiException("我喝酒了"); //new对象自定义异常消息存储在构造方法中
// }
//方法二:声明异常数据,并用try 。。catch捕获抛出
public void say() {
try {
throw new DiYiException("我喝酒了"); //new对象自定义异常消息存储在构造方法中
} catch (DiYiException e) {
e.printStackTrace();
}
}
//mian方法
public static void main(String[] args) throws DiYiException {
DiYiTest test = new DiYiTest();
test.say();
}
}
5、第二种RuntimeException封装测试
package com.jbrh.pojo;
/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {
//方法二:声明异常数据,并用try 。。catch捕获抛出
public void say() {
try {
throw new DiYiException("我喝酒了"); //new对象自定义异常消息存储在构造方法中
} catch (DiYiException e) {
//异常 包装成 RuntimeException 异常继续抛出
RuntimeException exception = new RuntimeException(e);
throw exception;
}
}
//mian方法
public static void main(String[] args) throws DiYiException {
DiYiTest test = new DiYiTest();
test.say();
}
}
6、第三种try--catch控制测试
package com.jbrh.pojo;
/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {
//方法一:声明异常数据,并用throws抛出
public void say() throws DiYiException{
throw new DiYiException("我喝酒了");
}
public static void main(String[] args) {
DiYiTest test = new DiYiTest();
try {
test.say();
} catch (DiYiException e) {
System.out.println("异常:"+e.getMessage());
}
}
7、Java checked 异常 和 RuntimeException(运行时异常)
对于异常分两种:检查异常和非检查异常(运行时异常)检查异常 : 编译时被检测的异常 (throw后,方法有能力处理就try-catch处理,没能力处理就必须throws)。编译不通过,检查语法(其实就是throw和throws的配套使用)。运行时异常 : 编译时不被检查的异常(运行时异常。RuntimeException及其子类)。编译通过。