java 中的异常处理机制

来源:互联网 发布:淘宝网售后服务 编辑:程序博客网 时间:2024/05/16 15:18

平时敲代码的时候,编辑器有异常会有提示,显示什么就点什么了,却没有深入了解这些为什么会有这些异常。

5个关键字:
try,catch,throw,throws,finally

Throwable为程序中所有错误处理的父类
有两个重要的子类: Error(错误)和 Exception(异常)
Exception(异常):是程序本身可以处理的
主要包括:
RuntimeException:属于不可查异常,表示代码本身存在BUG,不是try-catch能解决的。
例如:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
IndexOutOfBoundsException - 下标越界异常
这些异常在编译期是无法检测出来的

不是RuntimeException:就是编译时异常,比如你在处理文件流时的I/O问题,就属于编译时异常。这个时候用thr{}catch 来捕获或者 throws即可。
例如:IOException,包括其子类 :
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常

Error(错误):是程序无法处理的错误,这种异常被设计成不被捕获,因为这种异常产生于JVM自身。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

现在理解之前说的5个关键词
异常处理有两种方式:

1.try…catch…finally
try:用来检测异常的
catch:用来捕获异常的
finally:释放资源的(可以有,也可以没有)
*可以多个catch,最多只能有一个finally
*无论try包围的语句中是否发生异常,finally必须执行
(有几种情况不执行:1.代码原因例如死循环在try块中 …….2.System.exit(),程序被终止……3.JVM崩溃了…..4.忽然断电……5.补充一个,多线程中若将含有finally块的线程设置为守护线程,setDaemon(true),当非守护线程结束时,守护线程会被JVM立即停止)
*return可以放在try块里面,但是finally块在返回前要被执行

2.throw,throws
thrwos是方法可能抛出异常的声明
语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常
出现在方法函数头

throw是语句抛出的异常
语句用在方法体内,表示抛出异常,由方法体内的语句处理。
是具体向外抛异常的动作,所以它是抛出一个异常实例。
出现在函数体
程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
throw 抛出的只能够是可抛出类Throwable 或者其子类的实例对象。如 throw new IOException;

也可以自定义异常类,当然要继承Exception类;

目前理解这么多,若有更深的理解会补充
技术小白,仅供参考,若有理解不到位的地方,欢迎提出问题,一起进步哈

1 0