`
ydbc
  • 浏览: 721620 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

提高你的Java代码质量吧:不要在finally块中处理返回值

 
阅读更多

一、分析

在finally中处理return返回值,代码上看上去很完美,都符合逻辑,但是执行起来就会产生逻辑错误,最重要的一点是finally是用来做异常处理的收尾处理的,一旦加上return语句,就会让程序的复杂程度陡然提升,而且会在一些隐蔽性非常高的错误。

与return语句相似,System.exit(0)或Runtime.getRuntime().exit(0)出现在异常代码块中也会产生非常多的错误假象

二、场景

如代码如下

public static void main(String[] args){ 
    try{ 
        doStuff(-1); 
        doStuff(100); 
    }catch(Exception e){ 
        System.out.println("这里是永远都不会到达的"); 
    } 
} 
 
//该方法抛出受检异常 
public static int doStuff(int _p)throws Exception{ 
    try{ 
       if(_p < 0){ 
           throw new DataFormatException("数据格式错误"); 
       }else{ 
           return _p; 
       } 
    }catch(Exception e){ 
        //异常处理 
        return e; 
    }finally{ 
        return -1; 
    } 
} 

doStuff(-1)的值是-1,doStuff(100)的值也是-1,调用doStuff方法永远都会抛出异常。原因就是我们在finally代码块中加入了return语句,而回导致这两个问题:

1.覆盖了try代码块中的return返回值

当执行doStuff(-1)时,doStuff方法产生了DataFormatException异常,catch块在捕捉此异常后直接抛出,之后代码块执行到finally代码块,就会重置返回值,结果就是-1了,也就出现了先返回,在执行finally,在重置返回值的情况。

2.屏蔽异常

为什么明明把异常throw出去了,但main方法捕捉不到呢?这是因为异常线程在监视到有异常发生时,就会登记当前的异常类型为DataFormatException,但是当执行器执行finally代码块时,则会重新为doStuff方法赋值,也就是告诉调用者“该方法执行正确,没有产生异常,返回值是1”,于是乎,异常就神奇的消失了。

三、建议

不要在finally代码块出现return语句


分享到:
评论

相关推荐

    Java异常处理.md

    在Java中,通过try、catch和finally语句来实现异常捕获与处理: 1. **基础异常捕获**: - 当代码执行过程中出现如除数为零的`ArithmeticException`等错误时,Java会立即转至相应的catch块进行异常处理,如输出错误...

    java 中finally语句块与return的执行关系

    finally语句块与return的执行关系

    Java中的异常处理机制.md

    try块包含可能会抛出异常的代码,catch块包含用于处理特定类型异常的代码,finally块包含无论是否发生异常都需要执行的代码。 示例: ```java try { // 尝试执行的代码,可能会抛出异常 int result = 10 / 0; ...

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

    实验六:Java异常处理

    本次实验掌握Java异常的概念及工作机制,了解异常的分类,掌握抛出异常语句的使用(throw)、抛出捕获处理异常语句的使用(try…catch…finally)及上抛异常语句的使用(throws)和创建自定义异常等。

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    Java高级程序设计:第8章-异常处理.pptx

    目标 知道什么是异常(Exception),如何处理异常 能够区分checked ...异常是在程序执行过程中,中断了正常指令流程的事件。 异常(Exception) When an error occurs within a method, the method creates an obje

    no-try:通过删除try-catch-finally块来清理代码! :rocket:

    :smiling_face_with_heart-eyes: 关于在可能期望方法throw的代码库中工作可能会导致逻辑包裹在try-catch块中的情况。 它还导致其他代码设计问题。 :nauseated_face: no-try通过将try-catch删除到外部方法来解决此...

    17.javatry…catch…finally语句.zip

    17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...

    关于Java中finally语句块的深度辨析.doc

    关于Java中finally语句块的深度辨析.doc

    基础深化和提高-异常机制

    在try块中放置可能抛出异常的代码,在catch块中处理捕获到的异常,而finally块中的代码总是会被执行,无论是否发生异常。 异常类型: Java中的异常分为已检查异常(checked exception)和未检查异常(unchecked ...

    10道Java常见异常面试题含答案(很全)

    Java异常处理是Java编程中一个非常重要的部分,它允许程序在遇到错误或异常情况时采取适当的行动,而不是简单地崩溃。 在Java中,异常(Exception)是一种特殊的对象,表示程序运行过程中出现的问题。Java提供了很...

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    try_catch_finally异常处理java

    压缩包里有本人录制的一个小视屏,不会的亲们,可以看下哦~~~ 笨人要期末考了呢,录些小视屏供自己复习所用,也是为了资源共享~O(∩_∩)O~

    详解Java编程中final,finalize,finally的区别

    主要介绍了详解Java编程中final,finalize,finally的区别,这个在Java面试题中简直是太常见了...需要的朋友可以参考下

    Java面试题合集最新版2024.zip

    异常处理:了解try-catch-finally块的使用,以及自定义异常的处理。 二、Java进阶知识 集合框架:熟悉Java集合框架中的List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。 泛型:理解泛型的概念...

    finally块3---马克-to-win java视频

    finally块3---马克-to-win java视频的详细的描述与介绍

Global site tag (gtag.js) - Google Analytics