浅析java异常
1、基本概念
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用。。。)时JAVA就会用异常对象来描述。
2、JAVA中有两种处理异常的办法:
1、在发生异常的地方直接处理; 2、将异常抛给调用者,让调用者处理。
3、异常分类
(1)检查性异常即编译异常:java.lang.Exception
(2)运行期异常:java.Runtime.Exception
请务必记住:只能在代码中忽略RuntimeException及其子类,究其原因是因为RutimeException代表的是编程错误。
(3)错误:java.lang.Error
顶层是java.lang.Throwale类,检查项异常,运行期异常,错误都是这个类的子孙类。java.lang.Exception、 java.lang.Error都继承自java.lang.Throwale,而java.Runtime.Exception继承自java.lang.Exception。
想要对异常有更深刻的理解最好去浏览一下API帮助文档,对异常来说关键是理解概念以及如何使用。
4、异常类的常用方法
Exception类有自己的数据成员和成员方法。其构造方法为:public Exception() public Exception(String s)
其公有方法为(都是从Throwable继承来的)
public String getMessage()返回异常信息
public String toString()返回异常类型的简要说明
public void printStackTrace()输出调用堆栈路径
5、异常的终止与恢复
异常处理理论上有两种基本模型。Java支持终止模型。在这种模型中,将假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行。一旦异常被抛出,就表明错误已经无法挽回,也不能回来继续执行。
另一种成为恢复模型。意思是异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法,并认为第二次能成功。对于恢复模型,通常希望异常被处理以后能继续执行程序。如果想用java实现类似的恢复行为,那么遇见错误时就不能抛出异常,而是调用方法来修正该错误。或者把try块放到while循环里,这样不断的进入try块,直到得到满意的结果。
长久以来,尽管程序员使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型的代码”,并且忽略恢复行为。所以虽然恢复模型开始很吸引人,但不是很实用。其主要原因可能是它所导致的耦合:恢复性的处理程序需要了解异常抛出的地点,这势必包含依赖于抛出位置的非通用性代码。这正加了代码编写和维护的困难,对于异常可能会从很多地方抛出的大型程序来说,更是如此。
6、java异常处理机制
1、try。。。Catch
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
2.Finally
如果把finally块置于try。。Catch。。语句后,finally块一般都会得到执行,它相当与一个万能保险,及时前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。Finally一般出一个清理工作:java有垃圾回收机制所以内存释放不再是问题,需要清理的资源一般包括:已经打开的文件或网络,在屏幕上画的图形等。
以下情形,finally块将不会被执行:
(1)finally块中发生异常;
(2)程序所在的线程死亡;
(3)在前面代码中用了System.exit();
(4)关闭cpu。
7、方法声明抛出异常throws
程序员可以不在当前方法内处理异常,而是把异常抛出到调用方法中。
方法头声明抛出异常:
[修饰符] 返回类型 方法名([参数表])throws 异常类型1,异常类型2{
……
会产生异常类型1异常的语句
……
会产生异常类型2异常的语句
……
}
运行时异常(RuntimeException类及其子类)可以不被处理,
同样,运行时异常若不处理,也可以不用throws声明,但其他异常若在方法内不被处理,则必须用throws声明。
调用声明抛出异常的方法时,需要进行异常处理,或者也将异常抛出,由其上级调用者处理。
异常的传播过程
发现异常的方法若不能处理异常,这时异常被抛出给其上级调用者。
如果调用者也不能处理这个异常,还可以继续传递给上级调用者去处理,这种传播会一直继续到异常被处理为止。
如果程序始终没处理这个异常,异常会传递到Java虚拟机运行时系统,运行时系统捕获这异常后通常只是简单地终止这个程序。
8、抛出自定义异常
自定义异常:从Exception继承的类
异常类中可以有与异常相关的属性和方法,可以被异常处理调用
在方法内抛出自定义异常
方法体内:创建异常对象,并抛出。
throw 异常对象;
方法头:声明抛出异常列表
以上便是我对异常的简单的理解,记录下来方便以后需查阅,如能帮到某位码友,是我的荣幸。如有不周还望海涵