一、分析
在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){
//异常处理
throw 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语句。
分享到:
相关推荐
1. **避免捕获可预检查的RuntimeException**:在Java中,像NullPointerException和IndexOutOfBoundsException这样的异常可以通过预先检查来避免,而不是通过catch块处理。例如,应该在调用对象的方法前检查对象是否...
在实际操作中,为了确保转换后的Java代码质量和可读性,需要对转换结果进行审查和调整。此外,理解两种语言的异同以及熟悉Java编程的最佳实践是至关重要的。在进行大型项目转换时,还应考虑测试策略,确保转换后的...
在这个结构中,`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块确保在任何情况下都会执行,如关闭文件流或释放资源。 3. 异常处理流程 当一个异常发生时,Java会创建一个异常对象...
在Java面试中,异常处理往往是考核的重点,因为它反映了候选人的代码质量、问题解决能力和对语言规范的理解。 1. **Java异常处理机制**:Java异常处理是通过一组关键字(try、catch、finally、throw和throws)来...
Java代码规范是编程实践中至关重要的一个方面,它旨在确保代码的质量、可读性和维护性。以下是一些核心的Java代码规范要点: 1. **命名规范**: - 类名使用大驼峰命名法,所有单词首字母大写,例如`ClassName`。 ...
【Java代码编码规范】是Java开发者应当遵循的重要指导原则,旨在提升代码的可读性、可维护性和团队协作效率。编码规范不仅适用于专业的产品级代码,也应当贯穿于学习和实验过程中的每一个阶段。以下是对Java编码规范...
了解和熟练运用异常处理技巧,能够提升代码质量,减少程序出错的可能性,提高用户体验。通过合理地使用`try-catch-finally`,以及正确地处理`checked`和`unchecked`异常,开发者可以编写出更加安全、可靠的Java应用...
在Java程序中,AST类用于表示程序的语法结构,使得我们可以对代码进行各种操作,如静态分析、重构或代码质量检查。CodeQL提供了一系列的类来支持这些操作,这些类主要分为两类:Statement类和Expression类。 1. ...
3. 使用 finally 关键字:`finally` 代码块确保关键操作(如关闭文件流或数据库连接)在任何情况下都会执行,即使在异常处理中。 4. 不忽略异常:除非有充分的理由,否则不应忽视捕获的异常。忽略异常可能导致隐藏...
传统错误处理方式通常是通过检查函数返回值来处理错误,这种方式容易导致正常代码与错误处理代码混杂,增加了程序的复杂度和维护难度。Java采用面向对象的方法来进行异常处理,通过将异常封装到类中,利用“try/...
Java中finally和return的关系实例解析 Java中finally和return的关系实例解析是Java编程语言中一个重要的...Java中finally和return的关系实例解析是一个非常重要的知识点,掌握它可以帮助开发者写出高质量的Java代码。
通过这些示例代码的学习,开发者可以更好地掌握Java的核心概念,并将其应用于实际项目中,提高开发效率和代码质量。记得实践是检验真理的唯一标准,理论学习的同时,务必动手实践,不断调试和完善代码。
### JAVA代码编写的30条建议 #### 一、命名规范与编码习惯 1. **遵循良好的命名习惯**:变量名、方法名等应该清晰易懂。...希望这些经验和技巧能够帮助你在编写Java代码时更加得心应手,提高代码质量和效率。
4. **try-with-resources**:Java 7引入了try-with-resources语句,使得资源的打开和关闭更加简洁和安全,自动处理了finally块中的资源释放。 5. **钻石操作符**:在Java 7中,创建泛型实例时可以省略类型参数,...
8. **增强的异常处理**:1.6引入了`finally`块中的`return`语句,允许在`finally`块中返回值,解决了某些情况下无法返回值的问题。 9. **动态代理**:Java 1.6增强了动态代理机制,允许在运行时创建代理类,动态...
- `default`:在switch表达式中,如果没有其他匹配项,则执行默认代码块。 - `do`:启动一个do-while循环。 - `double`:表示双精度浮点数类型。 - `else`:与if一起使用,表示如果if条件不满足时执行的代码块。 - `...
在Java异常处理中,finally语句块用于确保无论是否发生异常,某些必要的清理工作都能被执行,如关闭文件流、数据库连接等。忽视finally语句的使用,特别是在涉及到资源管理的情况下,可能导致资源泄露,从而影响系统...
Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的...在实际开发中,合理地应用这些规范对于编写出高质量的Java程序是非常重要的。
4. **错误处理**:不要忽视异常,应该用`try-catch-finally`块来捕获和处理异常。在finally块中释放资源,确保程序的健壮性。 5. **避免魔法数字**:常量应使用枚举或静态final变量表示,避免在代码中直接使用未经...