java异常
1.异常类的继承体系
image.png2
unchecked异常表示编程错误,程序不可能自己恢复,是你自己无法预料的,所有RuntimeException和它的子类还有Error都是unchecked,不需要try catch。不需要在编译的时候处理。
checked异常说明是可以恢复的,并强制调用者会处理异常,必须try catch或者throws。比如在读写文件的时候要catch IOException,执行数据库要有SQLException。
从RuntimeException继承的异常包括这样的异常:
1)classCastException类型转换
2)IndexoutofBoundException数组越界d
3)NullPointerException空指针
不从RuntimeException继承的异常包括:
1)EOFException 在输入的过程中意外到达文件或流的末尾
2)MalformedURLException 试图打开格式错误的网址
3)ClassNotFoundException 找不到类
4.什么时候用检查/非检查异常
使用检查异常:正确使用API无法防止异常情况,程序员可以采取一些有用的行动
5.声明异常,
throws,当一个方法可能抛出checked的异常,例如FileNotFOundException代表:文件类本身可能会抛出异常,或者文件类调用的子方法可能会抛出异常,并且子方法没有catch它而是向上抛。
如果从超类重写方法,子类方法声明的checked异常不能比父类大。
6.在catch异常的时候,catch可以写多个,子类写上面
7.finally会在方法return执行之前执行,所以finally里面别写return。
8.catch块是可选的,可以只有try finally
9.Java7新特性:finally里面关闭资源的句子可以写:
try(Resource res=…){
Work with res
}
因为所有的IO资源类都实现了AutoCLoseable接口
image.png定义自己的异常类:
[图片上传中...(image-ccc394-1552015133207-0)]
下面是我之前自己写的。
finally总会执行,回收try用到的物理资源,
throws主要在方法签名中使用,用于声明该方法可能抛出的异常。
throw用来抛出一个实际的异常,抛出一个具体的异常对象。
当Java环境收到异常后,会寻找能处理该异常对象的catch块,如果找到合适的catch块,就把异常信息交给他处理,如果没有找到,则运行环境终止。不管程序代码在哪里,就算是catch中的代码,只要出现了异常,就会自动生成一个异常对象,如果没人catch,就终止。
问题:
即使catch了,能不停止?不会,一旦被catch,那么后面的代码继续执行。
Throwable,下面有Error和Exception两个大类.
Java7开始,一个catch块可以捕获多种类型的异常,每种异常之间需要用 | 分开,捕获多种类型的异常时,异常变量由final修饰,不能对异常重新赋值。而当只捕获一种异常时,是没有final修饰的。
关于try,catch和finally的执行顺序:当在try或者catch里面遇到return,或者throw,这两个语句都会导致方法立即结束,(??难道不应该是该去找对应的catch了吗?这说的应该是没有找到),但是不会真的结束,系统会找有没有finally,如果有就去执行finally,执行完了回来再继续执行return和throw,如果没有finally,那就停止了,如果finall里面又有return什么的那也停止了,不会再转回try,catch里面执行了。
在Java7以前,如果在try里面做了什么数据库连接之类的,都要在finally里面关掉,但是在7之后,try可以➕(),来关掉,具体怎么写,到时候百度百度吧。367页。
Throws
使用throws的思路是,不知道当前要如何处理这种异常,改异常应该让上一级调用者处理,如果mian也不知道,就用throws抛给JVM,JVM处理的方式是,打印异常的跟踪栈,并终止程序。throws可以抛出多个异常类,他们之间用,隔开,
throws抛出异常的时候有一个限制,就是在重写的时候,子类抛出的异常不能比父类抛的大。
throw抛出的是一个异常实例,