C# 和java的finally

本文通过具体的代码示例对比了Java和C#中finally块的行为差异,特别是关于是否允许在finally块中返回值的情况。在Java中,可以在finally块中返回值并改变方法的返回结果;而在C#中,编译器会阻止此类行为,以避免意外地修改返回值。

   本文章主要对比 java和C#执行finally的异同。

一:C#中的处理

   C#代码

 class Program
    {
        static void error()
        {
            throw new Exception();
        }
        static int test()
        {
            int a = 0;
            try
            {
                a++;
                return a;
            }
            catch (Exception)
            {
                a++;
                return a;
            }
            finally
            {
                a++; 
                 //return a; 在C#中编译器做了限制,提示控制不能离开 finally 子句主体,可以意外的修改了返回值
            }
        }
        static void Main(string[] args)
        {
            test();
            Console.ReadKey();
        }
    }

  

应的汇编代码

 

        {
00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  push        edi 
00000004  push        esi 
00000005  push        ebx 
00000006  sub         esp,38h 
00000009  lea         edi,[ebp-44h] 
0000000c  mov         ecx,0Eh 
00000011  xor         eax,eax 
00000013  rep stos    dword ptr es:[edi] 
00000015  cmp         dword ptr ds:[05A81010h],0 
0000001c  je          00000023 
0000001e  call        61AD423A 
00000023  xor         edx,edx 
00000025  mov         dword ptr [ebp-3Ch],edx 
00000028  xor         edx,edx 
0000002a  mov         dword ptr [ebp-40h],edx 
0000002d  nop 
            int a = 0;
0000002e  xor         edx,edx 
00000030  mov         dword ptr [ebp-3Ch],edx 
            try
            {
00000033  nop 
                a++;
00000034  inc         dword ptr [ebp-3Ch] 
                return a;
00000037  mov         eax,dword ptr [ebp-3Ch] 
0000003a  mov         dword ptr [ebp-40h],eax 
0000003d  nop 
0000003e  mov         dword ptr [ebp-20h],0 
00000045  mov         dword ptr [ebp-1Ch],0FCh 
0000004c  push        1552F1Fh 
00000051  jmp         0000007A  //跳转到finally
            }
            catch (Exception)
00000053  mov         dword ptr [ebp-44h],eax 
            {
00000056  nop 
                a++;
00000057  inc         dword ptr [ebp-3Ch] 
                return a;
0000005a  mov         eax,dword ptr [ebp-3Ch] 
0000005d  mov         dword ptr [ebp-40h],eax 
00000060  call        6183F8CD 
00000065  mov         dword ptr [ebp-20h],0 
0000006c  mov         dword ptr [ebp-1Ch],0FCh 
00000073  push        1552F16h 
00000078  jmp         0000007A //跳转到finally
            }
            finally
            {
0000007a  nop 
                a++; 
0000007b  inc         dword ptr [ebp-3Ch] 
            }
0000007e  nop 
0000007f  pop         eax 
00000080  jmp         eax 
00000082  nop 
        }
00000083  mov         eax,dword ptr [ebp-40h] 
00000086  lea         esp,[ebp-0Ch] 
00000089  pop         ebx 
0000008a  pop         esi 
0000008b  pop         edi 
0000008c  pop         ebp 
0000008d  ret 
0000008e  mov         dword ptr [ebp-1Ch],0 
00000095  jmp         00000082 
00000097  mov         dword ptr [ebp-1Ch],0 
0000009e  jmp         00000082 

 

   从上面汇编代码中,可以看到 finally 时在return 之后执行。如果我们在finally中添加返回值,系统提示:

   不能离开 finally 子句主体

   在C#中编译器做了限制,可以防止我们意外的修改了返回值。

 

  二:java中的处理

  java代码

public class mainn {
	 
	static int test()
	{
		int a=0;
		try
		{
			a++;
			int c = Integer.parseInt("33d");
			return a;
		}
		catch(Exception ex)
		{
			a++;
			return a;
		}
		finally
		{
			a++;
                       //return a;
		}
		
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int c =  test();
		System.out.println(c);
		
	}

}

 在没有异常的情况下输出1,有异常的情况下输出2。如果我们在finally中增加返回值,可以看到返回结果是3。感觉这点java没有C#做的好。

 

##########################2014-05-27####################

今天看到这篇文章,放进来

finally子语里的return...险恶啊 http://rednaxelafx.iteye.com/blog/189908

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值