Java中finally块报finally block does not complete normally

一、出现问题

当finall块中包含return语句时,Eclipse会给出警告"finally block does not complete normally"

二、分析原因
1 finally块中的return语句会覆盖try块、catch块中的return语句
2 如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常

三、结论

finally内部使用 return 语句是一种很不好的习惯,如果try中还有return语句,它会覆盖了try 区域中 return语句的返回值,程序的可读性差。面对上述情况,其实更合理的做法是,既不在try block内部中使用return语句,也不在finally内部使用 return语句,而应该在
finally 语句之后使用return来表示函数的结束和返回。

原帖地址:http://blog.csdn.net/luckarecs/article/details/7214826

时间: 2024-09-18 23:13:10

Java中finally块报finally block does not complete normally的相关文章

在Java中自由块的执行顺序_java

java中的自由块分为静态的自由块和非静态的自由块. 非静态自由块的执行时间是:在执行构造函数之前. 静态自由块的执行时间是:class文件加载时执行. 非静态自由块可以多次执行,只要初始化一个对象就会执行,但是静态自由块只会在类装载的时候执行一次,一般用来初始化类的静态变量的值. 每次初始化一个对象,都会导致一次非静态块的执行. 如果涉及到继承,则是:首先执行父类的非静态块,然后是父类的构造函数,接着是自己的自由块,最后是自己的构造函数. 静态块的执行时机是在class文件装载的时候,clas

举例说明Java中代码块的执行顺序_java

前言    今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论    这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下:     实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行)  

javaee-java中构造块和成员变量的执行顺序是依据什么机制?

问题描述 java中构造块和成员变量的执行顺序是依据什么机制? 代码的执行不是应该和写的顺序无关吗 但是为什么构造块和成员变量的顺序不一样,执行的结果也不一样呢??? 求大神解答 解决方案 你的理解是有误的,成员变量的初始化值跟代码顺序有一定关系的.java创建对象时,对实例变量即类的非静态成员的初始化,主要在三个地方 1 成员变量定义时指定初始值 2 非静态代码块中指定初始值 3 构造函数中对成员变量指定初值值 这三种方式1,2执行先于构造函数3的执行,但是1,2方式的执行顺序与源程序中的排列

java中网络编程关于使用ObjetInputStream传输报错的问题,求大神指点

问题描述 java中网络编程关于使用ObjetInputStream传输报错的问题,求大神指点 以下贴出来的代码为通过ObjectInputStream(OutputStream)在客户端与服务器端之间交互时传输的对象,提供的图片中一个是客户端的代码片段,一个是服务器端的代码片段. 现在问题出在当客户端输完账号密码点击确定时,客户端卡死(应该是线程阻塞).服务器端抛出异常 :java.lang.ClassNotFoundException: com.wish.data.TransferObjec

Java中异常处理之try和catch代码块的使用_java

Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说).幸运的是,这很容易避免. 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个

请问大神在数据库中可以执行的sql语句,为什么通过java类连接数据库执行报错

问题描述 请问大神在数据库中可以执行的sql语句,为什么通过java类连接数据库执行报错 报错信息: java.sql.SQLException: Already closed. 解决方案 这个错误提示并不是SQL语句的错误,而是Java的SQL操作类的连接对象已经关闭了,不能执行SQL而报出的异常. 解决方案二: 连接已经关了,当然出错了 解决方案三: 数据库为open,先open 在进行相应cmd命令执行. 解决方案四: 你的连接关闭了,jdbc去连接数据库啊 解决方案五: 这个问题还不是你

java中static{.......}代码块的作用

问题描述 java中static{.......}代码块的作用 java中static{.......}代码块主要用在哪里,表示什么意思,有什么用,里面主要写什么内容 解决方案 static后不跟方法名,这个块在该类第一次加载的时候运行,就是说比初始化模块还早就运行,一般用于加载该类需要一次性完成的功能使用. 解决方案二: Java中的static静态代码块 解决方案三: 初始化用,不需要创建实例,当你访问这个类时,就会执行 解决方案四: static 就是静态.你可以搜索一下关于静态的解释.网

代码-A类使用static块报错 java.lang.NoClassDefFoundError

问题描述 A类使用static块报错 java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: Could not initialize class XXXclass 是什么原因? 有两台服务器 一台启动正常 一台启动不正常 报了这个 我是跑任务的时候 写了个类,直接调 A.aaa(),好像根本就没执行static静态代码块里面的方法. A里面有个static静态块,里面的方法没执行就报错了. 解决方案 可能原因是在执行A.aa

insert语句在pl/sql中替换数据可以执行,但是java中却报错

问题描述 insert语句在pl/sql中替换数据可以执行,但是java中却报错 java语句: public int initiating(String title, String content, String numberLimit,String fkCustomerId) { String pkId = "44"; String sql="insert into ACTIVITY_INFO (pk_id,title,content,fk_customer_id,num