java 异常处理机制
浅谈Java异常情况及异常处理机制
提示: try - catch - finally是大家非常熟悉的语句,看起来不难,却隐藏不少容易忽略的知识点。
提示:
一、Error、Exception?
Error:Java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况,比如:StacOverflowError和OOM,一般不编写针对性代码进行处理
Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以用针对性的代码进行处理,例如
1、空指针访问 2、试图读取不存在的文件 3、网络链接中断 4、数组角标越界
二、异常结构
java.lang.Throwable
|- - -java.lang.Error:一般不编写针对性的
代码进行处理
|- - -java.lang.Exception:可以进行异常的处理
|- - - 编译时异常(checked)
|- - -IOException
|- - -ClassNotfoundException
|- - -运行时异常(unchecked)
|- - -NullPointerException
|- - -ArrayIndexOutOfBoundsException
|- - -ClassCastException
|- - -NumberFormatException
|- - -InputMismatchException
|- - -ArithmeticException
三、异常处理模型
过程一:“抛”;程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个异常类的对象。
并将此对象抛出,
一旦抛出对象后,其后的代码就不再执行。
过程二:“抓”:可以理解为异常的处理方式:
1、try - catch-finally 2、throws
关于异常此对象的产生:
1、系统自动生成的异常对象
2、手动的生成一个异常对象,并抛出(throws)
四、常见异常处理问题?
开发中如何选择try - catch - finally 还是使用throws?
1、如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try - catch - finally 方式处理。
2、执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的,我们建议这几个方法使用throws的方式进行处理,而执行的方法a可以考虑使用try - catch - finally方式进行处理
如何自定义异常类?
1、继承现有的异常结构:RuntimeException、Exception
2、提供全局常量:serialVersionUID(serialVersionUID 相当于Java类的身份证,主要用于版本控制。(java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的)
3、提供重载的构造器
疑惑点:throw 和 throws
throw,异常的生成阶段,手动抛出异常对象的过程,声明在方法体;throws,异常处理的处理方式,声明方法可能要抛出的各种异常类。声明在方法的声明处。可比喻为:上流排污,下流治污来形容
如何看待代码中的编译时异常和运行时的异常?
体会1、使用try - catch - finally处理编译异常,使得程序在编译时就不再报错,但是运行时仍可能报错;相当于我们使用try - catch - finally将一个编译时可能出现的异常,延迟到运行时出现。
体会2、开发中运行时异常比较常见,所以我们通常不针对运行时异常编写try - catch - finally了。针对于编译时异常,我们说一定要考虑异常处理
五、补充:
注意:
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
finally的再说明:
1、finally是可选的,finally声明的是一定会被执行的代码,即使catch中又出现异常了,try中return预具,catch中,return语句等情况。
2、像数据库连接,输入输出流,网络编程socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放,此时的资源释放,就需要声明再finally中。