Posted on 2005-10-13 14:15
-=Kinohl=- 阅读(557)
评论(0) 编辑 收藏 所属分类:
编程语言
Java异常处理机制
keywords:
Exception,Method Inovation Stack,
难度:初学,易
异常类的继承
Java异常是java程序运行时遇到非正常情况而创建的一种对象,她包装了异常的信息。
Java异常的顶级类就是java.lang.Throwable。其结构如下:
其中
Error ---- JVM的错误,也就是程序本身无法恢复的严重错误。
Exception--被程序捕获并处理的异常。
JVM的方法调用堆栈
大家对于Debug都很喜欢,因为每当有异常出现的时候,她会告诉你哪里出了异常调用到底是什么。这又是如何实现的?
在JVM中使用了Method Inovation Stack机制来跟踪每一个线程中一系列的方法调用过程。并保存在Stack里边。
Stack的顶端也就是当前正在处理的方法。在Debug的时候,JVM会暂停被debug的线程,克隆她的Stack,然后显示出来供
developer操作,这一点用Eclipse的人很有体验吧。
一旦异常发生,JVM首先从当前的方法开始寻找处理的try/Catch,找不到,就回朔到stack的下一个,也就是parent调用
方法。举例如下:
public void child(int a)throws UserException{
if (a < 0)
throw new UserException();
}
父方法如下:
public void parent(int a){
try{
a = 1;
method(a);//throw Exception
}catch(UserException ue){
System.out.println("I get it from Child")!
ue.printExceptionStack();
}
}
就这样,异常被抓住了。当然,如果在child方法里边就捕获,parent就不用这么“累”了。
其实最累的还是JVM,她要对异常捕获进行查找,如果一直都找不到,就把异常直接抛给用户,那么在终端上就能看
到了。如果是抛出异常的程序是主程,还没有被捕获,那就“死翘翘”了。要注意!
异常处理对性能的影响
从上边的原理就能知道,不捕捉异常、捕捉异常的位置不合适、都会导致JVM性能降低。
(PS:先记到这里,继续上班。)