本文章主要对比 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
相关推荐
4. 异常处理:C#的异常处理基于`try-catch-finally`,Java则有`try-with-resources`,转换时需保持异常处理的正确性。 5. 静态与实例方法:C#中的静态成员和Java的静态方法有相似之处,但在类结构和继承上有所不同...
3. 异常处理:C#使用`try-catch-finally`结构,而Java也类似,但没有`finally`块的语法糖。在转换时,需要调整异常处理代码。 4. 枚举和注解:C#的枚举和Java的枚举类在用法上有所不同,注解在Java中比C#更常见。...
- **异常处理**: C#和Java都采用了类似的异常处理机制,支持try-catch-finally语句。 11. **Member Initialization at Definition and Static Constructors** - **成员初始化**: 两种语言都支持在定义时进行成员...
5. **异常处理**:C#和Java都支持异常处理,但Java的异常处理是通过`try-catch-finally`块实现,C#也有类似的结构。 除了上述区别,C#和Java在类型系统、泛型、匿名方法、事件、委托、LINQ(Language Integrated ...
4. **异常处理**:C#使用try/catch/finally,Java使用try-catch-finally,两者的异常处理机制略有不同。 5. **线程与并发**:C#有Task和Thread,Java有Thread和ExecutorService,转换时需要考虑线程模型。 6. **库...
9. **严格的数组和字符串边界检查**:C#和JAVA都强制执行严格的数组和字符串边界检查,以防止越界错误的发生,这是对安全性和稳定性的重视体现。 10. **成员访问操作符**:与C++中的箭头(`->`)和作用域解析操作符...
C#使用`try-catch-finally`,Java也是,但C#还提供了`catch when`来过滤异常。 14. 类型转换: C#中,数字可以直接调用`int.Parse()`或`Convert.ToInt()`转换,Java则需要`Integer.parseInt()`或`String.valueOf()`...
6. **异常处理**:Java和C#都采用try-catch-finally语句处理异常,但C#的Exception过滤器允许更精细的控制。 7. **应用领域**:Java广泛应用于Web开发(如Spring框架)、Android移动开发以及大数据处理(如Hadoop)...
1. 类和对象:C#和Java都支持类和对象的概念,但在细节上有所不同。例如,C#中的属性(properties)在Java中需要转换为getter和setter方法。 2. 接口:C#的接口(interface)在Java中也需要转换为接口,但Java不...
6. 异常处理:C#的异常处理块转换为Java的try-catch-finally结构。 7. 构造器:C#的构造函数在Java中也需要有相应的实现。 8. 静态成员:C#的静态成员在Java中同样为静态。 9. LINQ:这部分在Java中可能需要转换为...
8. 异常处理:C#使用`try-catch-finally`,Java有类似的机制,但可以使用多个`catch`块。 使用代码转换器时,程序员需要注意,虽然转换器可以节省时间,但无法保证完全准确,尤其是当涉及到特定库或框架时。转换后...
3. **异常处理**:Java使用`try-catch-finally`语句块,C#也支持这种模式,但C#还引入了`using`语句,用于自动释放资源。 4. **多线程**:Java有`Thread`类和`Runnable`接口,C#则有`Thread`类和`Task`类,以及`...
对于从Java转到.NET平台的程序员来说,理解C#的基本概念和语法是非常重要的。以下是一些关键知识点: 1. **总体框架**: C#程序通常以`.cs`文件的形式存在,其中可以包含一个或多个类。类名不一定要与文件名相同,...
【北大青鸟内部资料C#和Java】是针对IT初学者和进阶者的一份珍贵资源,涵盖了C#与Java两种编程语言的核心概念、异同点以及基于这两种语言的项目开发实践经验。北大青鸟作为知名的IT职业教育机构,其教学资料在业内...
在IT行业的求职面试中,C#和Java是两种广泛应用的编程语言,对于软件工程师来说,掌握这两者的基本概念和技术要点至关重要。本篇文章将探讨这些关键知识点,并为面试者提供宝贵的建议。 1. C#基础: - .NET框架:...
8. **异常处理**:C#使用try-catch-finally结构,Java也有相似的机制,但Java还提供了throws关键字用于声明方法可能抛出的异常。 9. **集合框架**:C#的System.Collections.Generic和Java的java.util包提供了各自的...
C#的属性操作如`foo.size++`和`label.font.bold=true`在Java中可能需要更复杂的语句,如`foo.setSize(foo.getSize()+1)`和`label.getFont().setBold(true)`。 C#的索引器(Indexers)允许开发者像处理数组一样处理...
在软件开发领域,C#和JAVA是两种广泛应用的高级编程语言,它们都源于C++,但由不同的公司开发,形成了各自独特的特性和优势。本文将深入探讨这两种语言的相似之处以及它们之间的差异。 首先,C#和JAVA的共同点主要...
总之,C#和Java虽然在核心理念上相似,但各自都有独特的特性和语法,开发者需要根据具体项目需求和平台选择合适的技术栈。无论选择哪种语言,理解其特性并充分利用它们将有助于提高开发效率和代码质量。
- **C#**:C#支持异常处理机制,包括`try`、`catch`、`finally`等关键字,并且提供了一系列预定义的异常类来帮助开发者处理不同类型的错误情况。 - **Java**:Java同样支持类似的异常处理机制,并且还引入了`throws`...