`
ydbc
  • 浏览: 766737 次
  • 性别: 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开发异常处理与日志规范

    1. **避免捕获可预检查的RuntimeException**:在Java中,像NullPointerException和IndexOutOfBoundsException这样的异常可以通过预先检查来避免,而不是通过catch块处理。例如,应该在调用对象的方法前检查对象是否...

    VB代码转java代码,亲测可用

    在实际操作中,为了确保转换后的Java代码质量和可读性,需要对转换结果进行审查和调整。此外,理解两种语言的异同以及熟悉Java编程的最佳实践是至关重要的。在进行大型项目转换时,还应考虑测试策略,确保转换后的...

    JAVA中异常处理的WORD文档

    在这个结构中,`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块确保在任何情况下都会执行,如关闭文件流或释放资源。 3. 异常处理流程 当一个异常发生时,Java会创建一个异常对象...

    Java 异常处理面试集锦及答案20道

    在Java面试中,异常处理往往是考核的重点,因为它反映了候选人的代码质量、问题解决能力和对语言规范的理解。 1. **Java异常处理机制**:Java异常处理是通过一组关键字(try、catch、finally、throw和throws)来...

    JAVA代码规范 JAVA规范 代码规范

    Java代码规范是编程实践中至关重要的一个方面,它旨在确保代码的质量、可读性和维护性。以下是一些核心的Java代码规范要点: 1. **命名规范**: - 类名使用大驼峰命名法,所有单词首字母大写,例如`ClassName`。 ...

    java代码编码规范

    【Java代码编码规范】是Java开发者应当遵循的重要指导原则,旨在提升代码的可读性、可维护性和团队协作效率。编码规范不仅适用于专业的产品级代码,也应当贯穿于学习和实验过程中的每一个阶段。以下是对Java编码规范...

    Java异常处理

    了解和熟练运用异常处理技巧,能够提升代码质量,减少程序出错的可能性,提高用户体验。通过合理地使用`try-catch-finally`,以及正确地处理`checked`和`unchecked`异常,开发者可以编写出更加安全、可靠的Java应用...

    用于Java程序的抽象语法树类Abstractyntaxreelassesororking1

    在Java程序中,AST类用于表示程序的语法结构,使得我们可以对代码进行各种操作,如静态分析、重构或代码质量检查。CodeQL提供了一系列的类来支持这些操作,这些类主要分为两类:Statement类和Expression类。 1. ...

    JAVA编程中异常处理的方法和技巧研究.pdf

    3. 使用 finally 关键字:`finally` 代码块确保关键操作(如关闭文件流或数据库连接)在任何情况下都会执行,即使在异常处理中。 4. 不忽略异常:除非有充分的理由,否则不应忽视捕获的异常。忽略异常可能导致隐藏...

    Java异常处理及应用

    传统错误处理方式通常是通过检查函数返回值来处理错误,这种方式容易导致正常代码与错误处理代码混杂,增加了程序的复杂度和维护难度。Java采用面向对象的方法来进行异常处理,通过将异常封装到类中,利用“try/...

    Java中finally和return的关系实例解析

    Java中finally和return的关系实例解析 Java中finally和return的关系实例解析是Java编程语言中一个重要的...Java中finally和return的关系实例解析是一个非常重要的知识点,掌握它可以帮助开发者写出高质量的Java代码。

    corejava12示例代码

    通过这些示例代码的学习,开发者可以更好地掌握Java的核心概念,并将其应用于实际项目中,提高开发效率和代码质量。记得实践是检验真理的唯一标准,理论学习的同时,务必动手实践,不断调试和完善代码。

    JAVA代码编写的30条建议

    ### JAVA代码编写的30条建议 #### 一、命名规范与编码习惯 1. **遵循良好的命名习惯**:变量名、方法名等应该清晰易懂。...希望这些经验和技巧能够帮助你在编写Java代码时更加得心应手,提高代码质量和效率。

    JAVA_API_1.7中文(最新、最全).chm.7z

    4. **try-with-resources**:Java 7引入了try-with-resources语句,使得资源的打开和关闭更加简洁和安全,自动处理了finally块中的资源释放。 5. **钻石操作符**:在Java 7中,创建泛型实例时可以省略类型参数,...

    java1.6中文说明文档

    8. **增强的异常处理**:1.6引入了`finally`块中的`return`语句,允许在`finally`块中返回值,解决了某些情况下无法返回值的问题。 9. **动态代理**:Java 1.6增强了动态代理机制,允许在运行时创建代理类,动态...

    JAVA中的保留关键字

    - `default`:在switch表达式中,如果没有其他匹配项,则执行默认代码块。 - `do`:启动一个do-while循环。 - `double`:表示双精度浮点数类型。 - `else`:与if一起使用,表示如果if条件不满足时执行的代码块。 - `...

    Java Exception 几种不适当的处理

    在Java异常处理中,finally语句块用于确保无论是否发生异常,某些必要的清理工作都能被执行,如关闭文件流、数据库连接等。忽视finally语句的使用,特别是在涉及到资源管理的情况下,可能导致资源泄露,从而影响系统...

    java关键字和java命名规范.pdf

    Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的...在实际开发中,合理地应用这些规范对于编写出高质量的Java程序是非常重要的。

    Java编程规范,让你的程序可读性更高!

    4. **错误处理**:不要忽视异常,应该用`try-catch-finally`块来捕获和处理异常。在finally块中释放资源,确保程序的健壮性。 5. **避免魔法数字**:常量应使用枚举或静态final变量表示,避免在代码中直接使用未经...

Global site tag (gtag.js) - Google Analytics