`
javasee
  • 浏览: 968503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Jvm 学习——异常处理

阅读更多

异常表

每一个 try语句块 catch的异常都与异常表中的一项相对应,异常表中的每一项都包括:

  1. 起点
  2. 终点,始终把 catch异常位置的 pc指针偏移量的最大值大1
  3.   处理异常时跳转到的字节码序列中的 pc指针偏移量
  4.   catch的异常类的常量池索引

 

例如:

public   class  Test  {
    
public   static   void  main(String[] args)  {

        
try   {
            Class.forName(
" java.lang.String " );
        }
  catch  (ClassNotFoundException e)  {
            e.printStackTrace();
        }


    }

}

javap –c 查看字节码如下:

 

Compiled from  " Test.java "
public   class  Test  extends  java.lang.Object {
public  Test();
  Code:
   
0 :    aload_0
   
1 :    invokespecial    # 1 // Method java/lang/Object."<init>":()V
    4 :     return

public   static   void  main(java.lang.String[]);
  Code:
   
0 :    ldc    # 2 // String java.lang.String
    2 :    invokestatic    # 3 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
    5 :    pop    
   
6 :     goto      14
   
9 :    astore_1
   
10 :    aload_1
   
11 :    invokevirtual    # 5 // Method java/lang/ClassNotFoundException.printStackTrace:()V
    14 :     return
  Exception table:
   from   to  target type
     
0       6       9    Class java / lang / ClassNotFoundException
}

 

可见 ClassNotFoundException异常可能会在 0~6之间抛出, 9开始处的代码处理此异常。

 

当产生异常的时候, jvm将会在整个异常表中搜索与之匹配的项,如果当前 pc在异常表入口所指的范围内,并且所抛出的异常是此入口所指向的类或者其子类,则跳转到对应的处理代码继续执行。

 

方法可能会抛出哪些已检查异常

Class文件的 attribute_info中保存有 Exceptions属性,记录着每个方法 throws的异常信息。具体的可以查看 class类文件格式相关的文章。

 

athrow指令从栈顶弹出 Throwable对象引用,抛出异常。

 

finally语句

jvm规范中, finally语句是通过 jsr/jsr_w ret指令实现的。当执行 jsr/jsr_w的时候将 finally执行完成后的返回地址压入栈中,进入 finally后会马上将此地址保存到一个局部变量中,执行完成后, ret从此局部变量中取出返回地址。???为什么会先把返回地址保存到局部变量中呢???因为,当从 finally语句返回的时候需要将返回地址成栈中弹出,当 finally语句非正常结束 (break,continue,return, 抛异常 )的时候就不用再考虑这个问题。

 

以下是 jvm 规范中 Compiling finally 的一段:

void  tryFinally()  {
    
try   {
        tryItOut();
    }
  finally   {
        wrapItUp();
    }

}

the compiled code is
Method 
void  tryFinally()
   
0      aload_0             //  Beginning of try block
    1     invokevirtual # 6           //  Method Example.tryItOut()V
    4      jsr  14              //  Call finally block
    7       return              //  End of try block
    8      astore_1             //  Beginning of handler for any throw
    9      jsr  14              //  Call finally block
   12      aload_1             //  Push thrown value
   13      athrow             //   and rethrow the value to the invoker
   14      astore_2             //  Beginning of finally block
   15      aload_0             //  Push this
   16      invokevirtual # 5           //  Method Example.wrapItUp()V
   19      ret  2              //  Return from finally block
Exception table:
       From     To     Target         Type
    
0          4          8            any

 

tryItOut排除任何异常后都将会被异常表中的 any项捕获,执行完 finally后,会执行 athrow指令将异常抛出。

 

jdk的某一个版本开始就不会编译出编译出含 jsr/jsr_w ret的字节码了,因为有指令上的缺陷,导致 jvm的检验和分析系统出现漏洞。

 

再说 finally的非正常退出

finally中使用 break continue return、抛出异常等认为是 finally的非正常结束。非正常结束的时候, ret指令不会被执行,很可能会出现意想不到的结果。如:

 

public   class  Test  {
    
public   static   boolean  test( boolean  b)  {
        
while  (b)  {
            
try   {
                
return   true ;
            }
  finally   {
                
/**/ /*
                break;                          始终返回false
                continue;                         javac编译再java执行会出现死循环
                                                在eclipse中甚至会出现报错:提示找到不main class
                return false;                     始终返回false
                throw new RuntimeException("");    抛出异常
                 
*/

            }

        }


        
return   false ;
    }


    
public   static   void  main(String[] args)  {
        System.out.println(test(
true ));
    }

}


建议:在写 finally 语句的时候,尽量避免非正常结束!

0
0
分享到:
评论

相关推荐

    Java面试复习——异常处理

    Java面试准备——异常处理 本文学习自GitHub上的JavaGuide项目,感谢大佬的资源,此处为自我学习与整理,原项目链接 JavaGuide Java异常类层次结构图 Java中所有的异常都有一个祖先java.lang.Throwable。Throwable...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    9. **异常诊断**:书中可能会涵盖如何使用JVM提供的工具来定位和处理运行时异常,包括NoClassDefFoundError、OutOfMemoryError等常见问题。 10. **JVM与操作系统交互**:JVM并非孤立存在,它与操作系统有密切联系。...

    JAVA异常处理机制——经验与技巧.pdf

    在编程实践中,异常处理机制是保证程序健壮性和稳定性的重要手段。对于Java开发者而言,深入理解并熟练运用异常...本文提供了对Java异常处理机制的全面介绍,为读者在异常处理方面的深入学习和实践提供了坚实的基础。

    实战Java虚拟机——JVM故障诊断与性能优化

    通过阅读《实战Java虚拟机——JVM故障诊断与性能优化》,读者可以系统地学习JVM相关知识,提升故障排查和性能调优的能力。配合提供的源码和在线资源,读者可以在实践中加深理解和应用,使自己的Java开发技能更上一层...

    学习笔记——资料

    4. **异常处理** - **异常分类**:Java中的Checked异常和Unchecked异常,以及如何通过try-catch-finally语句块进行处理。 - **自定义异常**:如何创建和抛出自己的异常类。 5. **输入/输出流** - **IO流**:学习...

    jvmjava,java实现的JVM。.zip

    这有助于深入理解JVM的生命周期管理、异常处理、多线程等复杂概念。 五、优化与进阶 掌握JVM的工作原理后,开发者可以进行更高级的调优,如调整JVM参数以优化内存分配、提高垃圾收集效率等。此外,还可以探索JVM的...

    Java学习笔记——良葛格

    此外,笔记可能还会涉及异常处理,这是Java中处理错误的重要机制,通过try-catch-finally语句块来捕获并处理运行时错误。线程和并发处理也是Java的一大亮点,JDK5.0对多线程的支持进一步加强,提供了更高级的并发...

    JVM虚拟机源码(C++)

    - **错误和异常处理**:JVM如何处理运行时错误和异常,以及如何进行堆栈展开。 通过研究HotSpot源码,开发者可以更好地理解Java程序的运行机制,从而优化代码性能,排查疑难问题,甚至为JVM贡献自己的代码。这是一...

    Java JDK 6学习笔记——ppt简体版.rar

    通过"Java JDK 6学习笔记——ppt简体版",学习者可以系统地学习到如何使用JDK 6进行开发,包括环境配置、基本语法、类库使用、异常处理、IO流、网络编程、多线程等各个方面。PPT格式通常直观易懂,便于快速理解和...

    Java JDK 6学习笔记——ppt简体版

    3. **异常处理**:Java中的异常处理机制是程序健壮性的重要组成部分。学习笔记会介绍如何使用try-catch-finally块来捕获和处理异常,以及如何定义自定义异常。 4. **集合框架**:Java集合框架提供了多种数据结构,...

    jvm详解资料

    - **JVM规范**:JVM规范定义了JVM的架构和行为,包括内存布局、执行模型以及异常处理等关键方面。 - **Sun JVM**:Sun Microsystems(现已被Oracle收购)的JVM实现遵循JVM规范,提供了具体且高效的内存管理机制,...

    JVM笔记(阳哥).zip

    六、异常处理与调试 在JVM运行过程中,可能会遇到各种异常情况,如内存溢出、类加载异常等。理解这些异常的含义和处理方法,对于快速定位和解决问题非常关键。同时,掌握JVM的调试工具,如jstack、jmap、jhat等,...

    mini-jvm使用 Java 8 实现 jvm

    尽管mini-jvm简化了许多JVM的功能,但依然需要实现基本的异常处理框架。同时,虽然可能没有完全实现垃圾回收,但理解垃圾回收的基本原理,如可达性分析和标记清除等,对于实现mini-jvm也是必要的。 总结 通过实现...

    ImagesForJVM-JVM笔记图片

    7. **异常处理**:JVM支持异常处理机制,通过try-catch-finally语句块来捕获和处理异常。 8. **多线程**:JVM提供了对多线程的支持,每个线程都有自己的程序计数器和栈。 9. **性能调优**:通过调整JVM的参数,如...

    个人学习的java笔记——思维导图

    4. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,确保程序的健壮性。 5. **集合框架**:Java集合框架包括List、Set、Map等接口以及ArrayList、HashSet、HashMap等...

    mini-jvm in rust实现jvm,jvm-rs-main.zip

    在实际开发过程中,开发者可能会遇到诸如类型兼容性、内存管理、异常处理等问题。Rust的静态类型和所有权规则对这些挑战提供了良好的支持,但也可能需要对传统JVM思维进行调整。此外,由于Rust的生态系统相对较新,...

    JDK 6学习笔记——PPT简体版

    - **异常处理**:学习如何使用try-catch-finally语句处理程序运行时可能出现的异常。 2. **JDK 6的新特性** - **自动装箱与拆箱**:允许基本类型与对应的包装类之间进行自动转换,提高了代码的可读性。 - **可变...

Global site tag (gtag.js) - Google Analytics