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

JAVA中try-catch异常逃逸

    博客分类:
  • JAVA
 
阅读更多

    有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。

    1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?

    2) 如果catch中,抛出异常,finally是否继续执行?

    3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?

    4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?

 

    中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。

 

   答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。

 

    答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?

public static int test2() {
        try{
            System.out.println("try");
            throw  new RuntimeException("try");
        } catch (Exception e) {
            System.out.println("catch");
            return 1;
        } finally {
            System.out.println("finally");
            return 2;
        }
}

  如上述代码,那么最终返回的是“1”还是“2”?答案是2。

 

    答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。

 

    答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:

Throwable ex = null;
try{
	System.out.println("try");
	throw  new RuntimeException("try");
} catch (Exception e) {
	ex = e;
} finally {
	System.out.println("finally");
	if(ex != null) {
		throw new RuntimeException(ex);
	}
	return 2;
}

 

 

 

分享到:
评论

相关推荐

    Inside Java Virtual Machine 2nd 中文

    Java的异常处理机制允许程序在遇到错误时优雅地处理,通过try-catch-finally语句块捕获和处理异常。 总的来说,《Inside Java Virtual Machine 2nd 中文》深入探讨了JVM的各个方面,对于Java开发者来说,理解和...

    Java基础实战-Bank项目-源代码

    - 在项目中,使用try-catch-finally语句块来捕获和处理可能出现的异常,如除零错误、空指针异常等,确保程序的健壮性。 3. **集合框架**: - 使用ArrayList、LinkedList、HashMap等集合类存储和操作银行账户、...

    Java代码实例-文本编辑器.rar

    8. **异常处理**:良好的错误处理机制是任何应用的基础,Java的`try-catch-finally`结构用于捕获和处理可能出现的异常。 9. **版本控制**:如果项目包含了版本信息,可能会涉及到Git或其他版本控制系统,用于代码的...

    java代码实例-论坛管理系统设计(源代码+论文).rar

    11. **异常处理**:良好的异常处理机制能保证程序的健壮性,Java提供了try-catch-finally语句块和自定义异常类。 12. **测试**:单元测试和集成测试确保代码的质量和功能的正确性,JUnit和Mockito等工具可以帮助...

    Java代码实例-多线程与线程安全实践-基于Http协议的断点续传.rar

    Java的`try-catch-finally`结构和`Thread.UncaughtExceptionHandler`接口可以用来优雅地处理这些问题。 综上所述,这个Java代码实例深入探讨了多线程、线程安全和HTTP协议的结合,展示了如何在实际项目中实现断点续...

    Java程序源代码-人事管理系统.zip

    9. **异常处理**:Java中的try-catch-finally语句块和自定义异常类,用于捕获和处理程序运行时可能出现的问题。 10. **单元测试和集成测试**:JUnit和Mockito等工具用于编写测试代码,确保代码的正确性。 11. **...

    Java多线程之多线程异常捕捉

    总结起来,Java多线程中的异常处理需要特别关注,因为线程的并发性使得传统的try-catch-finally结构可能不足以应对所有情况。通过实现`Thread.UncaughtExceptionHandler`并将其绑定到线程工厂,我们可以确保线程在...

    JAVA代码实例-本地Jian听与远程端口扫描(源代码+论文).rar

    在Java中,我们可以使用Socket编程或者ServerSocket类来实现本地监听。ServerSocket创建后,它会绑定到特定的IP地址和端口号,然后等待客户端的连接请求。一旦有请求到来,服务器端就会建立一个Socket连接来处理这个...

    java面试资料大全

    - try-catch-finally语句块:理解如何捕获和处理异常,finally块的作用。 - 自定义异常:如何定义和抛出自定义异常。 4. **内存管理与垃圾回收**: - 内存区域:栈、堆、方法区、本地方法栈的讲解。 - 垃圾收集...

    java面试指南

    - 异常处理:了解如何使用try-catch-finally语句块处理异常,以及检查型和非检查型异常的区别。 - 内存管理:理解堆和栈内存的区别,以及垃圾回收机制的工作原理。 2. **数据类型与集合框架** - 基本数据类型与...

    Java虚拟机规范 深入java虚拟机

    JVM支持异常处理机制,通过try-catch-finally语句块捕获并处理异常。理解如何正确使用异常处理可以避免程序崩溃并提高代码健壮性。 8. **多线程** JVM支持多线程编程,线程间通信和同步通过 monitors(监视器)...

    Java虚拟机规范SE8(中文)

    7. **异常处理**:Java的异常处理基于`try-catch-finally`结构,允许在`catch`块中捕获和处理异常,`finally`块确保无论是否发生异常,都会执行特定代码。 8. **类型系统**:Java是强类型语言,类型系统包括基本...

    Java虚拟机规范(Java SE 7 中文版

    11. 其他改进:如改进的异常处理、垃圾收集算法优化、JMX改进等,都是Java SE 7中提升JVM性能和开发者体验的重要方面。 为了深入理解这些概念,可以参考压缩包中的"Java虚拟机规范 (Java SE 7 中文版).pdf"文档,它...

    java面试题集锦

    - try-catch-finally:掌握异常处理的基本结构,理解finally块的重要性。 - 自定义异常:知道如何定义并抛出自己的异常。 4. **内存模型**: - Java内存区域:包括堆、栈、方法区、本地方法栈、程序计数器等。 ...

    Java虚拟机模拟实现

    6. **异常处理**:JVM支持异常处理框架,通过try-catch-finally语句块来捕获和处理运行时异常。每个异常都会生成一个异常对象,并通过调用栈传递,直到找到合适的处理代码。 7. **多线程支持**:Java语言天然支持多...

    java深度历险

    - 异常处理:Java提供了异常处理机制,通过try-catch-finally语句块确保程序的健壮性。 - 内存管理:理解Java中的堆内存和栈内存,以及垃圾回收机制。 2. **Java虚拟机(JVM)**: - 类加载机制:JVM如何加载类...

    深入Java虚拟机光盘

    JVM提供了异常处理框架,通过try-catch-finally语句块来捕获和处理异常,异常类层次结构以Throwable为根。 9. **性能调优**: 通过JDK自带的JVisualVM、JConsole、JProfiler等工具,可以监控和分析JVM的运行状态...

    JAVA语言.rar

    4. 异常处理:Java引入了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,提高了程序的健壮性。 5. 安全性:Java有严格的安全模型,可以防止恶意代码的执行,比如通过类加载器和访问控制机制,...

    Java虚拟机规范

    Java异常是程序运行时的错误或异常情况,通过`try-catch-finally`结构捕获并处理。JVM在遇到异常时会生成一个异常对象,并按照异常处理表进行查找和传递。 8. **JVM优化** - **JIT编译器**:Just-In-Time编译器将...

    Java面试八股文十万字总结.docx

    - 使用try-catch-finally结构捕获并处理异常。 - 抛出异常时附带足够的信息。 - 不要忽略异常,尤其是检查异常。 **45. 说说深拷贝和浅拷贝?** - **浅拷贝**:复制对象本身,但不复制它所引用的对象。 - **深拷贝...

Global site tag (gtag.js) - Google Analytics