C#,Java,C++中的finally关键字

博客原文:http://hankjin.blog.163.com/blog/static/33731937201031511305338/

先说C++,标准C++不支持finally, 如果要实现finally的效果,可以用析构函数来实现: class
File_handle {
  
FILE* p;
public:
  
File_handle(const char* n, const char* a)
   
{ p = fopen(n,a); if (p==0) throw Open_error(errno); }
   File_handle(FILE* pp)
    { p = pp; if (p==0) throw
Open_error(errno); }

~File_handle() { fclose(p); }

operator FILE*() { return p; }

// ... };

C#和Java基本一致 以C#为例 无论是否有异常,理论上finially都会在最后被调用,实际上,要确保在执行到finally之前没有Exit
正常流程:注释掉2,运行流程为1-》3-》8-》7 异常流程:注释掉3和5,运行流程为1-》2-》4-》6-》8-》7
退出流程:注释掉3,运行流程为1-》2-》4-》5,注意这里finally没有被调用
C#代码 namespace
CXX
{
   
class TestX
   
{
        public
TestX()
       
{
           
Console.WriteLine("TestX constructor");//8
       
}
    }
    class Program
    {
        static
TestX f()
       
{
           
try
           
{
               
Console.WriteLine("Enter F");//1
               
throw new Exception("Tester");//2
               
return new TestX();//3
           
}
           
catch (Exception)
           
{
               
Console.WriteLine("Except caught");//4
               
System.Environment.Exit(0);//5
               
return new TestX();//6
           
}
           
finally
           
{
               
Console.WriteLine("Finaly");//7
           
}
       
}
        static
void Main(string[] args)
       
{
           
Program.f();
       
}
    }
} Java代码: class
A{
    public A(){
       
System.out.println("A construct");//8
   
}
}
public
class Test{
   
static A f(){
       
try{
           
System.out.println("Worked");//1
           
throw new Exception("Ok");//2
           
return new A();//3
       
}
       
catch(Exception e){
           
System.out.println("Except");//4
           
System.exit(1);//5
           
return new A();//6
       
}
       
finally{
           
System.out.println("Finaled");//7
       
}
    }
    public static void main(String
args[])throws Exception{
       
Test.f();
   
}
}

C#,Java,C++中的finally关键字,码迷,mamicode.com

时间: 2024-10-26 08:24:51

C#,Java,C++中的finally关键字的相关文章

安卓开发(Java)中关于final关键字与线程安全性

前言 学习新知识固然重要,但是时常往回看看,温故知新是很必要的.回顾一下线程安全性和final关键字. 正文 从Java 5开始,final keyword一个特殊用法是在并发库中一个非常重要且经常被忽视的武器.实质上,可以使用final来确保在构造对象时,访问该对象的另一个线程不会看到处于部分构造状态的对象,否则可能会发生这种情况.这是因为当作为对象变量的一个属性时,final作为其定义的一部分具有以下重要特征: 当构造函数退出时,final keyword的值保证对访问构造对象的其他线程可见

java基础中的 equals关键字 重写

equals (public boolean equals(Object obj)) 指示其他某个对象是否与此对象"相等". equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true. 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true. 传递性:对于任何非空引用值 x.y 和 z,如果 x.equals(y) 返回 true,并且

Java 8 中函数接口,陈货翻新了炒,只是为了Lambda表达式

Java开发人员应该对java.lang.Runnable,java.util.Comparator,java.util.concurrent.Callable 等等接口不会感到陌生.他们都只有一个单一的抽象方法.这样的接口,我们通常叫单一抽象方法接口(SAM,Single Abstract Method Interface). 以前大家应该经常使用下面的代码片段 public class InnerAnonymousClassSample { public static void main(S

JAVA多线程之Synchronized关键字--对象锁的特点

一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的特点. 二,分析 synchronized可以修饰实例方法,如下形式: 1 public class MyObject { 2 3 synchronized public void methodA() { 4 //do something.... 5 } 这里,synchronized 关键字锁住的是当前对象.这也是称为对象锁的原因. 为啥锁住当前对象?因为 methodA()是个实例方法,要想执行methodA(),

Java继承中的转型及其内存分配

看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; //① public String name = "Parent"; String getName(){ return name; } } class Student extends People { //定义一个私有的tag实例变量来隐藏父类的tag实例变量 String tag =

Java泛型中的协变和逆变

Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛型中引入通配符这个概念的时候,Java 其实是支持协变和逆变的. 看下面几行代码: // 不可变 List<Fruit>fruits =newArrayList<Apple>();// 编译不通过 // 协变 List<?extendsFruit>wildcardFruit

java基础(2):注释、关键字、标识符、数据

1. 注释.关键字与标识符 大家可以安装一个文本编辑软件notepad++,有利于java代码的查看与编写. 1.1 程序注释 通常我们需要在源代码中添加文字用来对进行代码解释说明,但这些文字并不是Java代码的语法,会导致编译出错.这时我们可以使用注释来完成这一事项! 在编译时,编译器会忽略注释的存在,就好像注释内容不存在一样.所以注释并不会导致编译出错,同时注释还方便编写者和其他人阅读源代码,加强对代码的理解. Java中提供了三种注释方式,分别是: 单行注释    //注释内容 多行注释 

浅析Java中的final关键字

原文出处: 海子 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字

浅谈Java泛型中的extends和super关键字(转)

泛型是在Java 1.5中被加入了,这里不讨论泛型的细节问题,这个在Thinking in Java第四版中讲的非常清楚,这里要讲的是super和extends关键字,以及在使用这两个关键字的时候为什么会不同的限制.    首先,我们定义两个类,A和B,并且假设B继承自A.下面的代码中,定义了几个静态泛型方法,这几个例子随便写的,并不是特别完善,我们主要考量编译失败的问题: public class Generic{ //方法一 public static <T extends A> void