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关键字的更多相关文章
- java继承中关于super关键字和this关键字的使用
1.super关键字 由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字.super 可以用来访问父类的构造方法.普通方法和属性.super 关键字的功能: ...
- 安卓开发(Java)中关于final关键字与线程安全性
前言 学习新知识固然重要,但是时常往回看看,温故知新是很必要的.回顾一下线程安全性和final关键字. 正文 从Java 5开始,final keyword一个特殊用法是在并发库中一个非常重要且经常被 ...
- 理解Java中的final关键字
final关键字的基本用法 1. 修饰类 出于安全考虑,类无法被继承 2. 修饰方法 防止继承类修改方法private方法会隐式指定为final方法: 3. 修饰变量 基本数据类型,初始化后不能再修改 ...
- zz剖析为什么在多核多线程程序中要慎用volatile关键字?
[摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持 ...
- Java继承中的转型及其内存分配
看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; ...
- Java基础中的一些注意点
1.在Java编程语言中,标识符是赋予变量.类或方法的名称.标识符可从一个字母.下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度. 2.Java技术源程序采 ...
- JAVA多线程之Synchronized关键字--对象锁的特点
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- java里面的标识符、关键字和类型
1. 注释 Java中有三种注释: (1) // -单行注释,注释从“//”开始,终止于行尾: (2) -多行注释,注释从““结束: (3) -是Java特有的doc注释,这种注释主 ...
- Java泛型中的协变和逆变
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
随机推荐
- Partition算法剖析
博文链接:http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 对,我是来骗访问量 ...
- 【Android - MD】之FloatingActionButton的使用
FloatingActionButton(FAB) 是 Android 5.0 新特性--Material Design 中的一个控件,是一种悬浮的按钮. FloatingActionButton 是 ...
- 移植QT到ZedBoard(制作运行库镜像) 交叉编译 分类: ubuntu shell ZedBoard OpenCV 2014-11-08 18:49 219人阅读 评论(0) 收藏
制作运行库 由于ubuntu的Qt运行库在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用运行库是 INCPATH = -I/usr//mkspecs/d ...
- 开始lisp的旅程
不知道是不是<黑客与画家>的老pual太能忽悠了,一直想把他吹捧的lisp学习一下. 看common lisp和On lisp两本书也有一段时间了,中间还夹着看了一点SICP和land o ...
- PNP8550(3.3V DC蜂鸣器) - 原理图系列
一.截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2Jpbl9ITEo4MA==/font/5a6L5L2T/fontsize/400/fi ...
- java几种字符串反转
java实现的字符串翻转,能想到的这几种方法 假设有其它方法,欢迎交流 //字符串反转 public class ReverseString { public String reverse1(Stri ...
- 使用AVCaptureSession捕捉视频
#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/ ...
- +load,+initialize原理
+load,+initialize原理 1.load 父类的load方法在子类load方法之前调用,分类的load方法在原来类load方法之后调用,依赖类的load方法会在自己之前调用,总之所有的类的 ...
- Java 原始数据类型转换
在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题: int a = -1; 我们经过多重转换之后:int b = (int)(char)(byte) a ...
- oracle的安装与plsql的环境配置
1,首先得有oracle的安装包和plsql的安装包,安装包地址可见百度云 http://pan.baidu.com/s/1miTqhmg 2.解压下来进入0817账套,找到set.exe文件,双击安 ...