二、Java异常类类图
下面是这几个类的层次图: java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.Error java.lang.ThreadDeath
下面四个类的介绍来自java api 文档 。
1、Throwable Throwable 类是 Java 语言中所有错误或异常的超类 。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出 。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型 。两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况 。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据) 。
2、Exception Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件 , 表示程序本身可以处理的异常 。
3、Error Error 是 Throwable 的子类,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题 。在执行该方法期间,无需在方法中通过throws声明可能抛出但没有捕获的 Error 的任何子类,因为Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过 。
4、RuntimeException RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类 。Java编译器不去检查它 , 也就是说 , 当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过 , 这种异常可以通过改进代码实现来避免 。
5、ThreadDeath 调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例 。仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例 。如果 ThreadDeath 被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止 。如果没有捕获 ThreadDeath , 则顶级错误处理程序不会输出消息 。虽然 ThreadDeath 类是“正常出现”的,但它只能是 Error 的子类而不是 Exception 的子类 , 因为许多应用程序捕获所有出现的 Exception,然后又将其放弃 。
以上是对有关异常API的一个简单介绍,用法都很简单,关键在于理解异常处理的原理,具体用法参看Java API文档 。
三、Java异常处理机制
对于可能出现异常的代码,有两种处理办法: 第一、在方法中用try...catch语句捕获并处理异常 , catach语句可以有多个,用来匹配多个异常 。例如: public void p(int x){ try{ ... }catch(Exception e){ ... }finally{ ... } }
第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常 。例如: public void test1() throws MyException{ ... if(....){ throw new MyException(); } } 如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止 。然后将异常交给相应的catch语句处理 。如果Java虚拟机追溯到方法调用栈最底部main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理: 第一、调用异常的对象的printStackTrace()方法,打印方法调用栈的异常信息 。第二、如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行 。通过分析思考可以看出,越早处理异常消耗的资源和时间越?。跋斓姆段б苍叫?。因此,不要把自己能处理的异常也抛给调用者 。还有一点,不可忽视:finally语句在任何情况下都必须执行的代码,这样可以保证一些在任何情况下都必须执行代码的可靠性 。比如,在数据库查询异常的时候,应该释放JDBC连接等等 。finally语句先于return语句执行,而不论其先后位置,也不管是否try块出现异常 。finally语句唯一不被执行的情况是方法执行了System.exit()方法 。System.exit()的作用是终止当前正在运行的 Java 虚拟机 。finally语句块中不能通过给变量赋新值来改变return的返回值,也建议不要在finally块中使用return语句 , 没有意义还容易导致错误 。
推荐阅读
- 电视怎么样搜回看少儿频道,电视上怎么看少儿频道
- gis都是二维数据么,gis干嘛的
- 小朋友最适合拍摄什么动漫,适合小朋友拍照的软件
- 无人直播直播背景文案素材,无人直播直播背景文案素材下载
- 包含mysql通配符怎么用的词条
- c语言身体质量指数bmi计算,c语言体重指数怎么算
- phpcms链接地址,phpcms使用教程
- c语言创建h函数 c语言中如何创建函数
- c语言输出每三个数字换行的简单介绍