含有return 的try catch finally的执行顺序!(很经典!)

firezxm 2009-12-11 03:27:35
static int f() {//这里报编译错误:must return a resutl of type int!
int id = 0;
try {
return id;
} catch (Exception e) {

} finally {

}
}

static int f2() {//但是这里怎么不报 错误呢?
int id = 0;
try {
return id;
} finally {
}
}
-------- try catch finally顺序:
1.try {}.
2.如果有Error Exception则,执行catch(){}中的代码。
3.无论有没有 Error Exception都要执行finally{}中的代码。
4.执行 try 中的 return
----------------------------------------------我的问题是----------------
1. 函数f中为什么报错误?在try中有return 啊!怎么说 must return a resutl of type int?? 当去掉catch之后,却没有报错误了,为什么呢???

2.谁能详细的说一说 try中有return的时候的 try catch finally return 的执行顺序??
...全文
9672 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
C少 2011-04-25
  • 打赏
  • 举报
回复
class Program
{
static int i = 0;
static void Main(string[] args)
{
int a = test();
//程序执行到这里,请问a和i的值分别为多少?

}

static int test()
{

try
{
return ++i;
}
catch
{
}
finally
{
i = 5;
}
return 100;
}
}
a=1;i=5也就是说把程序分为A.异常和B.正常:
A.此时再分为try异常和finally异常:1.先执行try,异常跳到catch
2.先执行try再到finally,finally异常跳到catch
B.正常时就先执行try,在执行finally,若finally中有return就返回一个值,以后不执行;若try中有return就返回try,返回一个值,return 100;不执行;若都没有就执行return 100;
zmkkobe 2010-09-18
  • 打赏
  • 举报
回复
总结的很好,
curtguo 2010-04-20
  • 打赏
  • 举报
回复
很简单,编译器检验了catch块中的语句,因为没有return值,所以又检测了finally中,又没有return,所以编译器通不过检查。所以,如果再catch或者finally中任一地方加入一个return语句,就正确了。
比如:
} catch (Exception e) {

} finally {
return 1;
}
sysygp 2010-03-18
  • 打赏
  • 举报
回复
程序一共两条流程,
1.try{}--finally{}
2.catch{}--finally{}
每条流程都必须有返回语句。若只有try{},没有catch{},则默认情况下是 发生异常时,先执行finally,最后在控制台输出错误信息,停止运行(相当于在catch中return)。

试想,如果try中有return,catch中没有return,finally中没有return。当出现异常时,走的是第2条流程,catch虽然捕获了异常,但是没有返回值,且finally中也没有return,就是说一旦执行第2流程,则没有返回值。如果此时finally中有return的话,即使catch中没有return,也是可以的。
huang0596 2009-12-19
  • 打赏
  • 举报
回复
有catch就说明程序可能会中断,也就是不一定会执行return....就好比你在一个if语句中写return一样..你必须保证让程序最后总是能返回一个值..
dajiadebeibei9 2009-12-19
  • 打赏
  • 举报
回复
catch里也需要有return语句 因为程序可能会发生异常执行到catch语句
如果正常语句里有return finally里可以不必加return
如果正常执行语句里没有return finall里必须有return
heartraid86 2009-12-19
  • 打赏
  • 举报
回复
f()方法中有可能出现这种情况:

当try中出现异常以后(异常在return id执行之前出现),此时JVM会转向catch块执行,但catch块中如果没有return,试问f()方法岂不是没有返回值了。这种情况当然不允许了。

f2()方法中,没有catch语句,出现异常JVM直接中止掉程序,并调用对应的异常处理器完成代码的遗愿而已。程序都中止了,也就不存在返回值了。至于finally块,在返回以前必须会执行,执行完以后就可以返回了。
至于在finally块中出现了return/throw语句,那么原来的返回将不再执行。这种编程习惯不太好,容易造成一些很难发现的bug。
bobo415 2009-12-18
  • 打赏
  • 举报
回复
f()和f2()有什么不同呢??
f()没有Catch()块 一定会执行到return语句 函数有返回值(至于能否返回正确的那是程序的逻辑问题 域编译无关)
f2()有catch()块 如果发生异常就执行不到return 函数没有了返回值(编译过不了)
编译的原理: 一定要保证程序可行 哪怕只有一种可能(像f2()有可能得不到返回值)
女女321 2009-12-18
  • 打赏
  • 举报
回复
倘若有异常的话会不会执行try里的return语句,应该会执行catch语句和finally语句,但是你的catch和finally里没有return语句,如果有的话就不会报错,要是都没有就不知道返回什么东西了,当然报错了
女女321 2009-12-18
  • 打赏
  • 举报
回复
JAVA异常处理有两种套路:1,捕获try-catch-finally。2,抛出throws
编程时应该先考虑用try-catch,而不是throws
捕获异常的格式:
try{
//可能发生异常的代码....
}catch(xxException e){
//异常发生以后处理的代码
}finally{
//不管发生不发生异常一定要执行的代码
}
finally可以出现1到N次,如果catch不出现就必须出现finally,catch出现了finally随便出现不出现
try只能出现一次,catch出现0-1次
它的运行顺序:
1,如果不发生异常时候执行try-finally
2,发生异常,try必定冲断,到catch
3,发生异常,try冲断到finally
4,发生异常,try冲断catch到finally继续运行下去,因为捕获了异常
try{
1
2
3
}catch(){
4
}
finally{
5
}
6
2若发生异常,则程序执行了1,2,4,5,6执行完毕
方法终结的3种,1,代码执行完了;2,执行到return ;3,有未捕获异常抛出也会终结
sean1203 2009-12-18
  • 打赏
  • 举报
回复
MARK
timeriver_wang 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 firezxm 的回复:]
try中遇到return语句的话,先计算表达式的值,在finally,最后把刚才try中计算的值返回(注意,最后退出返回的时候不再重新计算)!
[/Quote]
还真是!,不过我开始没看懂
我的代码
	public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum() {
int a=0;
try {
return a=3*6;
} finally {
System.out.println(a);
a=10;
}
}

结果:
18
18
weiminan 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 greenvesture 的回复:]
1.有catch就说明程序可能会中断,也就是不一定会执行return....就好比你在一个if语句中写return一样..你必须保证让程序最后总是能返回一个值..
2.就是你说的这个顺序
[/Quote]

同意这个说法!
qingzhe2008 2009-12-14
  • 打赏
  • 举报
回复
4、5楼的真是误人子弟
ScAREcrOw_ss 2009-12-14
  • 打赏
  • 举报
回复
鉴定结果:没意思。
firezxm 2009-12-13
  • 打赏
  • 举报
回复
public static String getPath0_2() {
File f = new File("e:\\");
try {
int j = 3;
String path = "";
path = f.getAbsolutePath();
return f.getAbsolutePath();//try中遇到return语句的话,先计算表达式的值,在finally,最后把刚才try中计算的值返回(注意,最后退出返回的时候不再重新计算)!
} finally {
f = null;
}
}
scarjia 2009-12-11
  • 打赏
  • 举报
回复

static int f() {//这里报编译错误:must return a resutl of type int!
int id = 0;
int c = 3;
try {
return id;
} catch (Exception e) {
return c;
} finally {
System.out.println("finally");
}
}


执行是先输出finally 再输出0
太白山鹰 2009-12-11
  • 打赏
  • 举报
回复
很早就见过了。。
bobo415 2009-12-11
  • 打赏
  • 举报
回复
顶楼上
你报是编译的错误
编译器他要确定万无一失的 管你会不会出异常
bayougeng 2009-12-11
  • 打赏
  • 举报
回复
编译器检查的是语法错误,而不是逻辑错误。
比如下面的语句:
try {
return id;
} catch (Exception e) {

}
你认为它不可能异常,肯定可以return。但编译器不管,它认为如果这个异常发生在return之前,你的这个方法就不能返回了。注意,它不会去检查你的return之前发生异常的可能性。它不是人,没那么聪明。
加载更多回复(19)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧