异常问题

Posted on 2012-11-09 16:00 志成中国 阅读(191) 评论(0)  编辑  收藏
java try catch 谁先执行问题,你能说明白吗
问题1 
 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果: 
public  class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
---------执行结果是什么  为什么 ---------
问题2
下面的程序代码输出的结果是多少?
public class  smallT
{
public static void  main(String args[])
{
smallT t  = new  smallT();
int  b  =  t.get();
System.out.println(b);
}
public int  get()
{
try
{
return 1 ;
}
finally
{
return 2 ;
}
}
}
       2012-6-19 16:23 满意回答 输出是1和2,
20705080 回答的很好了,只有几点补充下,首先代码例子用的是基本数据类型,他们进行传值就是传值,其次finally的用途是用来回收系统资源的,没有catch也是正常的使用(不catch,把异常throw回调用方法),再有finally和return是有关系的,而且经常有人提,就是finally的代码在return前运行,这就是我为什么先说你的例子是基本数据类型的原因,因为return x(1);被放入stack中,stack是后进先出的,等待finally运行完再运行,但他已经被赋值了就是1,如果你把代码改成这样试试看
public Something getSome(){
         Something s = new Something("Dog");
         try{
              return s;
        }finally{
             s.name ="cat";
         }}
加个类
class Something{
        public String name ;
        something(String name){
               this.name = name;}
}
因为相对于基本数据类型,引用传值传的值是个地址,return s(地址);放入stack中,又被取出时地址不变但地址那边的数据已经是cat了赞同0| 评论 
第1个
有finally的话
try 里的return    是先保存x的结果   等待finally走完   虽然x变2了  但是return的值还是1  
因为到return的时候已经把x的值取出来  等待finally走完  不管x怎么变  之前的1是不会变的
第2个
return     等待finally走完   但是finally里return了   所以返回的是2
    赞同0| 评论                2012-6-19 14:54 畅捷通丶稀饭 | 五级 
第一个是1,因为 x=1 try里面返回的是1 后面又执行了finally 后。X 是2 但是没有返回。所以 还是1
第二个是2,因为finally最后执行,返回的是2. 赞同0| 评论                2012-6-19 14:56 java2000_net | 
finally中的语句是一定要执行的,这点是肯定的。finally中的语句执行在try之后。通常try是要和catch(不捕获异常try就没意义了)。一般的用法是:
try{
1想要执行的代码
}catch(Exception e){
 2异常处理
}finally{
3最终执行的代码
}
1中代码没错执行的顺序就是1->3
1中代码有错执行的顺序是2->3
finally中的代码和return是没关系的,你可以把return写在任何地方。它只和try、catch有关。假如你把问题一种finally的代码写成:
finally{
return ++x;
}那么结果就是2了。
finally一定会执行,且在try或catch之后执行。
不知道这么说能明白吗~~~
不明白可以问,我再回答~~~ 赞同0| 评论                2012-6-19 15:22 黑夜也明亮 | 四级 
问题1:答案 1。因为return的值在执行finally之前已经确定下来了。所以即使在finally里怎么该值它始终是1,除非在finally里在return ++x重新修改返回的值。return x它不会直接返回值回去而是等程序执行完finaly后才返回。
你因该有听过有finaly的程序一定会执行finaly代码吧。
问题2:答案 2。根据一的结论二也是成立的。 赞同0| 评论                2012-6-19 16:41 iedgtg | 五级 
第一个问题:输出的是1,因为finally总是在try-catch执行之后执行,而且,一定是在return之前执行。第一个问题里应该是在return x;之前执行,但是,此时return的值已经固定了,就是说finally再执行也改变不了return的值,当然x的值成了2,但是return的值已经固定为1了。
第二个问题:输出的是2,因为finally一定是在return之前执行,本来程序return的值是1,即将要return了,但是有finally,所以finally先执行,所以return的值是2。
但是第二种情况不建议使用,就是说finally里不建议用return,因为这样finally就没有正常的执行完毕,这是不推荐的。 赞同0| 评论         

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 9, comments - 5, trackbacks - 0, articles - 0

Copyright © 志成中国