首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java中错误Exception的实现的一些分析

2013-11-04 
Java中异常Exception的实现的一些分析文章地址:http://blog.csdn.net/hengyunabc/article/details/1410861

Java中异常Exception的实现的一些分析

文章地址:http://blog.csdn.net/hengyunabc/article/details/14108617

前言:

最近发现一个很有用的Eclipse插件:http://andrei.gmxhome.de/bytecode/,可以在Eclipse直接查看,调试Java的字节码。

顺带研究了下Java里异常的实现机制,还有JDK7里的mutil catch的实现原理。


athrow指令:

在JVM里实现异常的指令是athrow,指令的参考在这里:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.athrow

大段的英文就不粘贴过来了:)。

个人理解:JVM是基于所谓的栈帧的(stack frame)的,一个函数调用链就是一个个栈帧组成,当在一个栈里用athrow抛出异常时,JVM会搜索当前函数的异常处理表(参考下面的Class文件分析),如果有找到对应的异常处理的handler,则由这个handler来处理。如果没有,则清理当前栈,再回到上一层栈帧中处理。如果一层层栈帧回退,最终都没有找到Exception Handler,则线程终止。


下面贴点实际代码:

一个简单的函数:

 public test3()V    TRYCATCHBLOCK L0 L1 L2 javax/naming/NamingException    TRYCATCHBLOCK L0 L1 L2 javax/xml/xpath/XPathException    TRYCATCHBLOCK L0 L1 L2 java/sql/SQLException   L0    LINENUMBER 77 L0    ALOAD 0    BIPUSH 100    INVOKEVIRTUAL Test.testFunc(I)V   L1    LINENUMBER 78 L1    GOTO L3   L2   FRAME SAME1 java/lang/Exception    ASTORE 1   L4    LINENUMBER 79 L4    ALOAD 1    INVOKEVIRTUAL java/lang/Exception.printStackTrace()V   L3    LINENUMBER 81 L3   FRAME SAME    RETURN   L5    LOCALVARIABLE this LTest; L0 L5 0    LOCALVARIABLE e Ljava/lang/Exception; L4 L3 1    MAXSTACK = 2    MAXLOCALS = 2

我们可以发现,每一个TRYCATCHBLOCK的配置都是一样的,只是异常的名字不一样。所以实际上mutil catch的实现和普通的实现没有太大的区别,当然从JVM的实现角度来看,mutil catch有可能可以优化Exception Handler的查找过程(纯猜测的,如果是线性查找,则效率是一样的)。不过有好处是可以减少class文件的体积,这个也比较有用,因为目前Java的class文件的大小是有限制的。参考这里;http://stackoverflow.com/questions/5497495/maximum-size-of-java-class-exception-table


总结:

Java中的异常的实现不是什么太神秘的东东,和人们的直觉的实现差不多。任何编程语言的异常机制都会有一定的开销,但是异常如果没有触发,实际上是没有开销的。

异常在触发时,要new一个异常对象,再一层层地栈帧回退,每层都要查找异常处理表,开销还是比较大的。

所在异常只应该用在合适的地方,如果异常像Switch那样用,那就悲剧了。


参考:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.athrow

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.10

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.3

http://andrei.gmxhome.de/bytecode/    非常有用的分析Java 汇编代码的Eclipse插件



热点排行