`

C# 和java的finally

阅读更多

   本文章主要对比 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

 

分享到:
评论

相关推荐

    C# To JAVA Converter v17.10.6(最新破解版)

    4. 异常处理:C#的异常处理基于`try-catch-finally`,Java则有`try-with-resources`,转换时需保持异常处理的正确性。 5. 静态与实例方法:C#中的静态成员和Java的静态方法有相似之处,但在类结构和继承上有所不同...

    c# java互相转换工具

    3. 异常处理:C#使用`try-catch-finally`结构,而Java也类似,但没有`finally`块的语法糖。在转换时,需要调整异常处理代码。 4. 枚举和注解:C#的枚举和Java的枚举类在用法上有所不同,注解在Java中比C#更常见。...

    论C#与Java之异同

    - **异常处理**: C#和Java都采用了类似的异常处理机制,支持try-catch-finally语句。 11. **Member Initialization at Definition and Static Constructors** - **成员初始化**: 两种语言都支持在定义时进行成员...

    C#与java的区别

    5. **异常处理**:C#和Java都支持异常处理,但Java的异常处理是通过`try-catch-finally`块实现,C#也有类似的结构。 除了上述区别,C#和Java在类型系统、泛型、匿名方法、事件、委托、LINQ(Language Integrated ...

    c#代码转java代码工具

    4. **异常处理**:C#使用try/catch/finally,Java使用try-catch-finally,两者的异常处理机制略有不同。 5. **线程与并发**:C#有Task和Thread,Java有Thread和ExecutorService,转换时需要考虑线程模型。 6. **库...

    C#与JAVA的比较

    9. **严格的数组和字符串边界检查**:C#和JAVA都强制执行严格的数组和字符串边界检查,以防止越界错误的发生,这是对安全性和稳定性的重视体现。 10. **成员访问操作符**:与C++中的箭头(`->`)和作用域解析操作符...

    C#和Java的区别(适合初学者)

    C#使用`try-catch-finally`,Java也是,但C#还提供了`catch when`来过滤异常。 14. 类型转换: C#中,数字可以直接调用`int.Parse()`或`Convert.ToInt()`转换,Java则需要`Integer.parseInt()`或`String.valueOf()`...

    C#和JAVA的相同点和不同点_八个文档详细比较

    6. **异常处理**:Java和C#都采用try-catch-finally语句处理异常,但C#的Exception过滤器允许更精细的控制。 7. **应用领域**:Java广泛应用于Web开发(如Spring框架)、Android移动开发以及大数据处理(如Hadoop)...

    C# to Java Converter.zip

    1. 类和对象:C#和Java都支持类和对象的概念,但在细节上有所不同。例如,C#中的属性(properties)在Java中需要转换为getter和setter方法。 2. 接口:C#的接口(interface)在Java中也需要转换为接口,但Java不...

    C#代码转java代码

    6. 异常处理:C#的异常处理块转换为Java的try-catch-finally结构。 7. 构造器:C#的构造函数在Java中也需要有相应的实现。 8. 静态成员:C#的静态成员在Java中同样为静态。 9. LINQ:这部分在Java中可能需要转换为...

    C#程序转Java程序代码转换器.zip

    8. 异常处理:C#使用`try-catch-finally`,Java有类似的机制,但可以使用多个`catch`块。 使用代码转换器时,程序员需要注意,虽然转换器可以节省时间,但无法保证完全准确,尤其是当涉及到特定库或框架时。转换后...

    java代码转c#

    3. **异常处理**:Java使用`try-catch-finally`语句块,C#也支持这种模式,但C#还引入了`using`语句,用于自动释放资源。 4. **多线程**:Java有`Thread`类和`Runnable`接口,C#则有`Thread`类和`Task`类,以及`...

    一周学会C# java程序员转.NET必看

    对于从Java转到.NET平台的程序员来说,理解C#的基本概念和语法是非常重要的。以下是一些关键知识点: 1. **总体框架**: C#程序通常以`.cs`文件的形式存在,其中可以包含一个或多个类。类名不一定要与文件名相同,...

    北大青鸟内部资料C#和java

    【北大青鸟内部资料C#和Java】是针对IT初学者和进阶者的一份珍贵资源,涵盖了C#与Java两种编程语言的核心概念、异同点以及基于这两种语言的项目开发实践经验。北大青鸟作为知名的IT职业教育机构,其教学资料在业内...

    C#和JAVA面试八股文

    在IT行业的求职面试中,C#和Java是两种广泛应用的编程语言,对于软件工程师来说,掌握这两者的基本概念和技术要点至关重要。本篇文章将探讨这些关键知识点,并为面试者提供宝贵的建议。 1. C#基础: - .NET框架:...

    CSharpt ToJ ava Converter 22.4.20 完美版

    8. **异常处理**:C#使用try-catch-finally结构,Java也有相似的机制,但Java还提供了throws关键字用于声明方法可能抛出的异常。 9. **集合框架**:C#的System.Collections.Generic和Java的java.util包提供了各自的...

    C#与JAVA比较.pdf

    C#的属性操作如`foo.size++`和`label.font.bold=true`在Java中可能需要更复杂的语句,如`foo.setSize(foo.getSize()+1)`和`label.getFont().setBold(true)`。 C#的索引器(Indexers)允许开发者像处理数组一样处理...

    C#与JAVA比较[文].pdf

    在软件开发领域,C#和JAVA是两种广泛应用的高级编程语言,它们都源于C++,但由不同的公司开发,形成了各自独特的特性和优势。本文将深入探讨这两种语言的相似之处以及它们之间的差异。 首先,C#和JAVA的共同点主要...

    c# vs java

    总之,C#和Java虽然在核心理念上相似,但各自都有独特的特性和语法,开发者需要根据具体项目需求和平台选择合适的技术栈。无论选择哪种语言,理解其特性并充分利用它们将有助于提高开发效率和代码质量。

    c#&java比较.txt

    - **C#**:C#支持异常处理机制,包括`try`、`catch`、`finally`等关键字,并且提供了一系列预定义的异常类来帮助开发者处理不同类型的错误情况。 - **Java**:Java同样支持类似的异常处理机制,并且还引入了`throws`...

Global site tag (gtag.js) - Google Analytics