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

被折叠的 条评论
为什么被折叠?



