有时候一些小的细节,确实比较纠结,对于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; }
相关推荐
Java的异常处理机制允许程序在遇到错误时优雅地处理,通过try-catch-finally语句块捕获和处理异常。 总的来说,《Inside Java Virtual Machine 2nd 中文》深入探讨了JVM的各个方面,对于Java开发者来说,理解和...
- 在项目中,使用try-catch-finally语句块来捕获和处理可能出现的异常,如除零错误、空指针异常等,确保程序的健壮性。 3. **集合框架**: - 使用ArrayList、LinkedList、HashMap等集合类存储和操作银行账户、...
8. **异常处理**:良好的错误处理机制是任何应用的基础,Java的`try-catch-finally`结构用于捕获和处理可能出现的异常。 9. **版本控制**:如果项目包含了版本信息,可能会涉及到Git或其他版本控制系统,用于代码的...
11. **异常处理**:良好的异常处理机制能保证程序的健壮性,Java提供了try-catch-finally语句块和自定义异常类。 12. **测试**:单元测试和集成测试确保代码的质量和功能的正确性,JUnit和Mockito等工具可以帮助...
Java的`try-catch-finally`结构和`Thread.UncaughtExceptionHandler`接口可以用来优雅地处理这些问题。 综上所述,这个Java代码实例深入探讨了多线程、线程安全和HTTP协议的结合,展示了如何在实际项目中实现断点续...
9. **异常处理**:Java中的try-catch-finally语句块和自定义异常类,用于捕获和处理程序运行时可能出现的问题。 10. **单元测试和集成测试**:JUnit和Mockito等工具用于编写测试代码,确保代码的正确性。 11. **...
总结起来,Java多线程中的异常处理需要特别关注,因为线程的并发性使得传统的try-catch-finally结构可能不足以应对所有情况。通过实现`Thread.UncaughtExceptionHandler`并将其绑定到线程工厂,我们可以确保线程在...
在Java中,我们可以使用Socket编程或者ServerSocket类来实现本地监听。ServerSocket创建后,它会绑定到特定的IP地址和端口号,然后等待客户端的连接请求。一旦有请求到来,服务器端就会建立一个Socket连接来处理这个...
- try-catch-finally语句块:理解如何捕获和处理异常,finally块的作用。 - 自定义异常:如何定义和抛出自定义异常。 4. **内存管理与垃圾回收**: - 内存区域:栈、堆、方法区、本地方法栈的讲解。 - 垃圾收集...
- 异常处理:了解如何使用try-catch-finally语句块处理异常,以及检查型和非检查型异常的区别。 - 内存管理:理解堆和栈内存的区别,以及垃圾回收机制的工作原理。 2. **数据类型与集合框架** - 基本数据类型与...
JVM支持异常处理机制,通过try-catch-finally语句块捕获并处理异常。理解如何正确使用异常处理可以避免程序崩溃并提高代码健壮性。 8. **多线程** JVM支持多线程编程,线程间通信和同步通过 monitors(监视器)...
7. **异常处理**:Java的异常处理基于`try-catch-finally`结构,允许在`catch`块中捕获和处理异常,`finally`块确保无论是否发生异常,都会执行特定代码。 8. **类型系统**:Java是强类型语言,类型系统包括基本...
11. 其他改进:如改进的异常处理、垃圾收集算法优化、JMX改进等,都是Java SE 7中提升JVM性能和开发者体验的重要方面。 为了深入理解这些概念,可以参考压缩包中的"Java虚拟机规范 (Java SE 7 中文版).pdf"文档,它...
- try-catch-finally:掌握异常处理的基本结构,理解finally块的重要性。 - 自定义异常:知道如何定义并抛出自己的异常。 4. **内存模型**: - Java内存区域:包括堆、栈、方法区、本地方法栈、程序计数器等。 ...
6. **异常处理**:JVM支持异常处理框架,通过try-catch-finally语句块来捕获和处理运行时异常。每个异常都会生成一个异常对象,并通过调用栈传递,直到找到合适的处理代码。 7. **多线程支持**:Java语言天然支持多...
- 异常处理:Java提供了异常处理机制,通过try-catch-finally语句块确保程序的健壮性。 - 内存管理:理解Java中的堆内存和栈内存,以及垃圾回收机制。 2. **Java虚拟机(JVM)**: - 类加载机制:JVM如何加载类...
JVM提供了异常处理框架,通过try-catch-finally语句块来捕获和处理异常,异常类层次结构以Throwable为根。 9. **性能调优**: 通过JDK自带的JVisualVM、JConsole、JProfiler等工具,可以监控和分析JVM的运行状态...
4. 异常处理:Java引入了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,提高了程序的健壮性。 5. 安全性:Java有严格的安全模型,可以防止恶意代码的执行,比如通过类加载器和访问控制机制,...
Java异常是程序运行时的错误或异常情况,通过`try-catch-finally`结构捕获并处理。JVM在遇到异常时会生成一个异常对象,并按照异常处理表进行查找和传递。 8. **JVM优化** - **JIT编译器**:Just-In-Time编译器将...
- 使用try-catch-finally结构捕获并处理异常。 - 抛出异常时附带足够的信息。 - 不要忽略异常,尤其是检查异常。 **45. 说说深拷贝和浅拷贝?** - **浅拷贝**:复制对象本身,但不复制它所引用的对象。 - **深拷贝...