`
snailke
  • 浏览: 2283 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一道很诡异的程序题

阅读更多
public int test()
{
     int a = 1;
     try
     {
          return a;
     }catch
     { 
          //todo:handle exception
     }finally
     {
          a++;
     }
     return a;
}


大家看看这个方法的返回值是多少啊?为什么try语句里的return会执行2次?第二次的确返回的是2,但打印的确是1.这是为什么啊?
分享到:
评论
22 楼 xiaotian8945 2010-11-28  
try中return会被覆盖掉的,最终返回的是finally中的结果。

finally是和try走的不是同一个机制,也就像上面的说的那样,可以认为try中的return和finally的代码是同时执行的。
21 楼 snailke 2010-11-21  
rainsilence 写道
thinking in java中有这样一句话
在try,catch中最好不要return,因为在finally中的操作会覆盖try catch中的return的结果。
所以你的代码的执行顺序就是try中return->finally。最后的return 不执行

但是在finally里面return的话,就直接返回finally里面的return的值了,而不是返回try里面return的值
20 楼 rainsilence 2010-11-21  
thinking in java中有这样一句话
在try,catch中最好不要return,因为在finally中的操作会覆盖try catch中的return的结果。
所以你的代码的执行顺序就是try中return->finally。最后的return 不执行
19 楼 闲言遂语 2010-11-21  
好像有个这说法, 就是说在finally中执行的代码 不是在return之前 执行, 而是与return 过程中执行, 所以返回是,实际上a最终是2  ----- 求鉴定
18 楼 flyingzl 2010-11-21  
看看Java程序语言设计第四版里面怎么说的吧(290页):


。。。。。。

控制总是由于某种原因才进入finally语句,这个原因可能是try代码正常结束,也可能是try块中执行诸如return这样的控制流语句,或者try代码块中执行的代码抛出了异常。当finally子句执行到底而退出时,这个原因就会被记录下来。但是,如果finally块因为执行了控制流语言(诸如break、return)或者抛出了异常而产生新的退出原因,那么这个新的原因就会替换旧的原因,而旧的原因会被抛弃。例如,考虑如下的代码:
try{
   //....do something.
   return 1;
}finally{
   return 2;
}


当try块执行它的return语句时,控制流将进入finally块,其“原因”是返回了值1,但是在finally块内部,返回了值2,因此,最初的意图就被遗弃了。事实上,如果try块中发生任何的异常,其结果任然返回为2。如果finally块不返回任何值而仅仅是直接执行到底,那么“返回值1”这个原因将被记住并如实返回。。。
17 楼 碧海山城 2010-11-21  
以前确实没注意到,try中操作的值会被保留,如果finally语句中有return会抛弃try中的值,否则返回保留的try中的值。

另外,还要注意,如果两个都操作的是一个引用类型。
16 楼 欧阳晓 2010-11-21  
无论try或catch中发生了什么情况,finally都是会被执行的,那么写在try或者catch中的return语句也就不会真正的从该函数中跳出了,它的作用在这种情况下就变成了将控制权(语句流程)转到finally块中;这种情况下一定要注意返回值的处理。

15 楼 snailke 2010-11-21  
buzaibeishang 写道
兄弟啊,上面的代码在Eclipse貌似运行不出来啊

恩 ,对的,直接在帖子编辑器里面敲的
14 楼 snailke 2010-11-21  
Aaron_Zhang 写道
虽然有return 但 finally 那步是最后执行 所以是1

但是在finally语句里面return,返回的值就是finally里面的鸟
13 楼 xix 2010-11-21  
10楼的将的很容易懂!很棒
12 楼 Aaron_Zhang 2010-11-20  
虽然有return 但 finally 那步是最后执行 所以是1
11 楼 坏孩子 2010-11-20  
反编译,看字节码,你就知道了
10 楼 因为java所以java 2010-11-20  
hamber 写道
还是不懂啊,那位大虾能更详细讲解下的?
哥不能不懂装懂啊···

首先:我不是大虾。
其次:你要理解你楼上的意思。

     我稍微说下我的理解:程序会一般都会执行finally语句的,但是try中的return的值是应该要被保存且被返回的。(如果try中有System.exit(0)或者断电的情况的话,finally语句是不被执行的)

第三点:java中无论是对于基础类型(int,byte,long,char,short,double,float,boolean)还是引用类型都是值传(pass by value)的。所以如果try中的return的是一个对象,而在finally里对这个对象的属性做了改变,是会被反映到try中return的对象中的
9 楼 因为java所以java 2010-11-20  
buzaibeishang 写道
兄弟啊,上面的代码在Eclipse貌似运行不出来啊

应该是楼主搞错了,在catch后面要加个exception的
8 楼 buzaibeishang 2010-11-20  
兄弟啊,上面的代码在Eclipse貌似运行不出来啊
7 楼 hamber 2010-11-20  
还是不懂啊,那位大虾能更详细讲解下的?
哥不能不懂装懂啊···
6 楼 elan1986 2010-11-20  
http://hi.baidu.com/freish/blog/item/9c77bf1126f6f670cb80c41d.html

这个讲解的比较清楚!

当finally中有return语句的时候,try中的return会被抛弃;当finally中没有return语句时,try中return的值会被保存且被返回。
5 楼 quix 2010-11-20  
说起来还真没怎么注意finally,受教了
4 楼 snailke 2010-11-20  
cnsuifeng 写道
http://www.soaspx.com/dotnet/csharp/csharp_20101021_6067.html

这里有解释  看一下吧


呵呵  太感谢你了,前段时间去面试的一个题目,我想结果肯定不是2,很果断地填了个1,回去在机子上
敲了一遍,还真是1,只是一直都不知道为什么
3 楼 cnsuifeng 2010-11-20  
http://www.soaspx.com/dotnet/csharp/csharp_20101021_6067.html

这里有解释  看一下吧

相关推荐

    有关c语言程序的一道题

    程序题main(){ float a,b; char c; printf("input expression: a+(-,*,/)b \n"); switch() { case '+': printf("%f\n",a+b);break; case '-': printf("%f\n",a-b);break; case '*': printf("%f\n",a*b);break...

    二级C语言上机考试题库,本题库是针对2008年4月份考试的上机考试题库,本题库共有100套题目(每套题目包含3道题:一道程序填空题、一道程序修改题、一道程序设计题)

    2. **程序修改题**:要求考生找出并修正给定程序中的错误。 3. **程序设计题**:要求考生根据题目要求编写完整的程序。 ### 二、程序填空题示例分析 #### 示例题目 ```c void fun(unsigned long *n) { unsigned ...

    c程序试题汇编

    每一道题目都是对理论知识的一次实践应用,通过解题,不仅可以巩固理论,还能锻炼解决问题的能力,这对于未来从事软件开发或其他涉及C语言的工作至关重要。 总之,《C程序试题汇编》是一本实用的教材,它将帮助你从...

    随机题库取题有说明程序_随机抽题_题库_

    在这个程序中,它意味着每一道试题的创建和定义都以清晰、易于理解的形式呈现,确保用户在编写或修改题库时能直观地了解每道题目的具体要求。逐行解释有助于减少误解,提高题目的准确性和一致性。 此外,“全部...

    C语言程序题

    这个是C语言程序设计的一道题,颇有意思的一道题,希望大家喜欢。

    2012天津中兴一面一道现场写程序题

    **背景**:本题目的背景是在一个中兴公司的面试过程中出现的一道编程题。题目要求对输入的字符串进行解析,并按照特定规则输出数字。 **解析规则**:输入的字符串由数字和逗号、短横线组成,例如“1,2-4,6-9,3”。...

    微信小程序源码(可用于毕业设计)-题库:选择选项,切换至下一题.zip

    【微信小程序源码(可用于毕业设计)-题库:选择选项,切换至下一题.zip】是一个包含微信小程序源代码的压缩文件,适用于毕业设计项目,尤其是对于那些关注于教育和考试领域的开发者。这个项目的核心功能是创建一个...

    谭浩强C++程序设计-习题程序

    这个压缩包包含了多个C++源代码文件,每个文件对应书中的一道或几道练习题目,为学习者提供了实际编程操作的机会,帮助他们巩固理论知识并提升编程技能。 C++是一种通用的、面向对象的编程语言,由Bjarne ...

    C#程序设计及应用教程(第二版)课后习题答案

    习题解答部分通常会包含详细的步骤和解释,对于每一道习题,都会提供一个或多个解题思路,帮助读者理解如何运用所学知识解决问题。例如,对于涉及算法的题目,可能需要利用循环和条件语句实现特定功能;而对于面向...

    浙江考研题的一道很有意思的程序

    程序表述 将数字对应的英文单词相加减时候得出数字上的结果

    ACM国际大学生程序设计大赛试题与解析

    每一道试题都伴随着详尽的解析,解析通常包括以下几个关键部分: 1. **问题描述**:清晰地阐述了题目所提出的问题,帮助读者理解题目要求。 2. **输入输出格式**:明确指出输入数据的格式和输出结果的预期形式,这...

    C语言程序设计题库及答案

    通过这个“C语言程序设计题库及答案”,学习者不仅可以检验自己的编程能力,还能在遇到问题时参考答案,深入理解每一道题背后的原理。此外,解题过程中实践和巩固所学知识,将大大提高C语言的实际运用能力。

    程序设计比赛字母游戏设计题

    这是我们学院程序设计比赛中一道字母应用题,颇有挑战意义,所以跟大家分享一下算法!

    跟涛哥一起学嵌入式 05:一道程序改错题,测出你的嵌入式功底1

    "跟涛哥一起学嵌入式 05:一道程序改错题,测出你的嵌入式功底1" 本文主要讲解了嵌入式开发中的一道改错题,题目是关于中断服务程序的设计和实现。中断是嵌入式开发中经常使用的一个功能,也是嵌入式工程师必须要...

    一道逻辑推理题的程序实现(纯属娱乐)

    标题中的“一道逻辑推理题的程序实现(纯属娱乐)”指的是通过编程来解决一个逻辑思维挑战的问题。这种问题通常需要运用到算法和数据结构的知识,可能是关于逻辑判断、搜索或者数学推理。在这个实例中,博主可能使用...

    全国计算机等级考试历届笔真题详解-二级C语言程序设计

    对于每一道题,通常会详细解释正确答案的选择依据,错误答案的陷阱所在,以及题目所涉及的理论知识。 同时,压缩包中包含的“全国计算机等级考试-二级教程-C++语言程序设计(2008年版)”虽然名称与标题不符,但C++...

    大学生程序设计大赛试题

    这是一道典型的矩阵操作题,考生需要理解矩阵索引的概念,以及如何在给定的限制条件下有效地遍历和计算矩阵元素。解题的关键在于正确理解和实现这个计算最小值的逻辑,可能需要用到滚动数组或者动态规划等高效算法。...

    java截取字符串程序,一道面试题。答案

    java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。

    天津大学901程序设计样题

    ### 天津大学901程序设计样题分析 #### 题目背景与目标 本题来源于天津大学计算机专业901科目考试中的程序设计样题,旨在...对于准备参加天津大学计算机专业研究生入学考试的同学来说,这是一道非常有价值的练习题。

Global site tag (gtag.js) - Google Analytics