(学习笔记)java中的异常捕获和处理
一、什么是异常?
异常有可以称为例外,差错,违例。它对应的是Java中的运行错误机制。程序的运行出现了超出预期的结果,它是不被期望的,会阻碍程序的正常运行。
传统语言中(例如C)要进行异常处理就会用到大量的if语句,这使得程序可读性差,维护性差等等。
java中谈到异常就离不开 try 、catch、finally、throw、throws这几个关键词。
异常的最上面一层类是Throwable,它下面又分为Error和Exception.
Error:JVM的错误
Exception:异常(我们一般说的异常就是Exception及其子类)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3m1RaCH-1616168565053)(C:\Users\杨丰\AppData\Roaming\Typora\typora-user-images\image-20210319221709300.png)]
java处理异常的大致流程:
程序允许时系统从调用栈中去找,从抛出异常的方法开始回溯,直到找到异常的捕获语句,如果异常得以正常处理,继续运行其他程序。假若异常得不到处理,则会交给JVM处理,一般会打印异常信息,结束程序。
二、异常捕获
抛出异常:
throw 异常对象;
异常捕获的基本语法:
try{
语句组;
}catch(异常类名 异常形式参数名){
异常处理语句组;
}catch(异常类名 异常形式参数名){
异常处理语句组;
}finally{
异常处理语句组;(资源关闭语句;)
}
try中放着被“监视”的、可能会产生异常的代码语句。
catch可以写多个,用来处理多个异常,这里要求子类异常要写在父类异常前面,同级异常不要求顺序。这里涉及到异常抑制。当对外部资源进行处理(例如读或写)时,如果遭遇了异常,且在随后的关闭外部资源过程中,又遭遇了异常,那么你catch到的将会是对外部资源进行处理时遭遇的异常,关闭资源时遭遇的异常将被“抑制”。但异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中,你可以通过被try代码块抛出的异常的Throwable.getSuppressed方法找回被压抑的异常,如e.getSuppressed()。
fanally无论有没有异常产生,都会执行,即使被监视语句中有return、break等结束语言。程序会先执行fanally中的语句,在执行到return等语句处。假若finally中也有return等语句,则不会跳回try和catch中执行。
java还有一种处理机制:try…with…resource
try(类型 变量名 = new 类型()){
执行的语句块;
}
这个机制自动添加执行了finally{变量.close();},这里的外部资源的句柄对象要求必须实现AutoCloseable接口。
三、异常分类
异常分为Error(错误)和Exception,他们都继承Throwable,我们一般说的异常就是Exception及其子类.
java异常检查分为受检异常和运行时异常
运行时异常:RuntimeException及其子类,可以不明确处理。
受检异常:除了RuntimeException及其子类,其他异常都是受检异常,这种异常要求进行明确语法处理,要么捕获处理,要么抛出。
子类在覆盖父类方法时,父类若声明了throws异常,也可以throws异常。
四、自定义异常
Java 中可以自定义异常,自定义异常需要扩展Exception类或许其除RuntimeException以外子类(这时自定义类属于受检异常),如果要自定义非检查异常,则扩展自RuntimeException。
自定义的异常应该总是包含如下的构造函数:
1.无参构造函数
2.带有String参数的构造函数,并传递给父类的构造函数。
3.带有String参数和Throwable参数,并都传递给父类构造函数
有时对于异常,不仅仅要捕获处理,还需要重抛异常,让调用者也能感受这种异常。这时可以在catch或者finally中:
1.再次抛出这个异常
throw e;
2.重新生成一个异常,并抛出
throw new Exception(“some message”)
3.重新生成一个异常,携带当前异常的信息,抛出
throw new Exception(“some message”,e)
可用e.getcause获得内部异常信息
五.断言(assertion)
断言是程序调试的一种手段.
assert的格式:
1.assert 表达式;
2.assert 表达式:错误信息;
如果表达式为false,产生异常,打印相关错误信息。断言默认不启动,需要启动断言,使用
-ea(enableasserttions)
如:java -ea -classpath . Asserttion
最后
新人学习笔记,记录成长。欢迎大家指正,交流!