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

【转载】try-catch

    博客分类:
  • Java
阅读更多

本文转载自http://shift-alt-ctrl.iteye.com/blog/2156937

 

有时候一些小的细节,确实比较纠结,对于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值时有意义的?

Java代码  收藏代码
  1. public static int test2() {  
  2.         try{  
  3.             System.out.println("try");  
  4.             throw  new RuntimeException("try");  
  5.         } catch (Exception e) {  
  6.             System.out.println("catch");  
  7.             return 1;  
  8.         } finally {  
  9.             System.out.println("finally");  
  10.             return 2;  
  11.         }  
  12. }  

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

 

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

 

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

Java代码  收藏代码
  1. Throwable ex = null;  
  2. try{  
  3.     System.out.println("try");  
  4.     throw  new RuntimeException("try");  
  5. catch (Exception e) {  
  6.     ex = e;  
  7. finally {  
  8.     System.out.println("finally");  
  9.     if(ex != null) {  
  10.         throw new RuntimeException(ex);  
  11.     }  
  12.     return 2;  
  13. }  

 

分享到:
评论

相关推荐

    java编写建议(转载)

    - 在处理异常时,应当优先使用`try-catch-finally`结构。 - `finally`块用于执行必要的清理操作,即使发生异常也能确保资源得到正确释放。 - 使用`throw`抛出异常以确保代码逻辑的健壮性。 #### 四、代码风格与注释...

    转载的可视化计算器编程

    这可能涉及异常处理机制,如在C++中的`try-catch`或Python的`try-except`结构。 7. **内存功能** 高级计算器具有存储和召回功能,允许用户保存中间结果。这需要在程序中实现变量或寄存器来保存这些值,并设计相应...

    java面试资料(转载)

    Java使用try-catch-finally语句块来捕获和处理异常,同时提倡使用finally块确保资源的正确释放。理解Checked异常和Unchecked异常的区别,以及如何有效地使用throws和throw关键字,有助于编写健壮的代码。 总之,这...

    Object-C 经典入门教程

    8. 异常处理:在Objective-C中,可以使用try-catch-finally结构来处理异常情况。 9. 动态类型和类别:Objective-C支持动态类型识别和类别(Categories),这为类的扩展提供了方便。 10. 内存管理:在Objective-C中...

    【RPA之家转载AA视频教程】25.How .rar

    同时,课程还会讲解如何利用"Try-Catch"结构来捕获和处理可能出现的错误,确保RPA流程的稳定性和可靠性。 通过学习这个视频教程,不仅可以掌握处理".rar"文件的基本技能,还能提升在实际RPA项目中处理复杂情况的...

    【RPA之家转载视频教程5】UiPath HandsOn 3第6部分-在CSV文件中写入CSV保存数据表.rar

    你将学习如何使用“Try-Catch”结构来捕获和处理异常,以及如何记录日志以供后续分析。 8. **工作流设计**:掌握如何使用UiPath的工作流设计原则,包括顺序流、条件分支和循环结构,以构建高效、可维护的自动化流程...

    Java面试资料大集合

    - **异常处理**:熟悉try-catch-finally结构,异常类型和异常链。 2. **集合框架** - **ArrayList和LinkedList**:它们的实现方式、性能特点及适用场景。 - **HashMap和HashSet**:底层实现原理,线程安全问题及...

    打败所有黑客的加密算法

    【欢迎转载或翻译该文】 现在上网,难免会涉及一些需要保密的内容,比如密码,账号,卡号,证件号等。但是黑客无处不在,他们常常窃听你的信息,给你放置陷阱,让你的防不胜防。 比如我现在要将信息“账号:123456...

    【RPA之家转载视频教程2】UiPath Studio中的数据抓取——使用UiPath将结果从网站复制到记事本.rar

    6. **错误处理**:理解如何设置错误处理机制,如Try-Catch块,以确保即使在遇到异常情况下,RPA流程仍能继续运行。 7. **调试与测试**:了解如何在UiPath Studio中进行流程调试,检查每个步骤的执行情况,确保自动...

    c#面试题 网络转载 不错 经典

    C#中的异常处理机制是通过try-catch-finally语句实现的。当程序执行过程中遇到错误时,会抛出一个异常对象,然后由catch块捕获并处理这个异常,finally块则无论是否发生异常都会执行,通常用于释放资源。 ### 方法...

    悠索科技高校教务管理系统(转载)

    7. **异常处理**:通过使用try-catch语句来捕获和处理运行时可能出现的错误,确保系统的稳定运行。 8. **单元测试**:为了保证代码质量,开发者可能利用了NUnit、xUnit等单元测试框架对各个模块进行测试。 9. **...

    java编程事项(转载收集整理版)

    3. **异常处理**:Java的异常处理机制是通过try-catch-finally语句块来实现的。理解如何正确抛出和捕获异常,以及何时使用特定类型的异常,对于编写健壮的代码至关重要。 4. **集合框架**:Java集合框架包括List...

    java连接HighGo DB

    代码中采用try-catch-finally结构进行异常处理。如果在建立连接的过程中发生异常,它将被捕获并打印堆栈跟踪信息。在finally块中确保数据库连接会被关闭,避免资源泄漏。在实际应用中,对资源的管理是十分重要的,这...

    java编程思想习题及答案

    4. **异常处理**:学习Java中的异常处理机制,包括try-catch-finally语句块,以及自定义异常。通过习题,可以锻炼处理运行时错误的能力。 5. **IO流与NIO**:掌握输入/输出流的基本用法,包括文件操作、网络通信等...

    Java面试题

    5. **异常处理**:理解Checked异常和Unchecked异常的区别,以及try-catch-finally语句块的使用。掌握自定义异常和异常链的创建。 6. **IO流**:掌握字节流和字符流的区别,以及缓冲流、转换流、对象流的应用。了解...

    c++沉思录.pdf c++学习的必备数据,

    - **异常处理**:C++支持异常处理机制,可以使用try-catch-finally语句来捕获和处理异常。 - **智能指针**:智能指针是一种特殊的指针类型,它能够自动管理内存资源,避免内存泄漏等问题。 - **Lambda表达式**:...

    java编程语言代码规范(中文)

    try-catch语句用于处理异常情况,确保程序的健壮性。 #### 八、空白 适当的空白可以使代码更加清晰易读。 ##### 8.1 空行 合理使用空行可以使代码结构更加分明。 ##### 8.2 空格 在关键字、运算符和变量之间...

    vertx-https-exceptions:https的转载者

    在Java中,异常处理通常使用`try-catch`语句块来捕获和处理可能出现的问题。在Vert.x中,由于其异步性质,可以使用Handler来处理异常。例如: ```java HttpServer server = vertx.createHttpServer(options); ...

    抽奖软件java

    7. **异常处理**:为了保证程序的健壮性,开发者会使用try-catch语句来捕获和处理可能出现的异常,例如读取文件时的IOException。 8. **设计模式**:良好的软件设计通常会运用设计模式,比如单例模式用于控制抽奖...

    c#学习完全手册,适用于初学者

    C#支持异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,确保程序的健壮性。 7. **泛型** 泛型是C#的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而创建可以应用于多种数据...

Global site tag (gtag.js) - Google Analytics