注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

关于异常:java与c++的不同  

2005-06-21 22:07:34|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天和同事讨论了一下java的异常,发现了个很诡异的东西。考虑如下代码:

public class TestException
{
  public static void main(String str)
  {
   int a = 1;
   try
   {
    if(1==a)
    {
     throw new Exception();
    }
   }
   catch(Exception e)
   {
    System.out.println("catch");
    return;
   }
   finally
   {
    System.out.println("finally");
    return;
   }
  }
}

那么,这个程序运行的结果是什么呢?答案:

catch
finally

比较奇怪的是,println("catch")后已经return了,可函数最终还是执行到了finally里面。由于java保证异常后的finally必须执行,因此忽略了catch中的return。

这里,俺认为java对这个无法做有效的解释。从逻辑上来说,java这里是自相矛盾的,return已经指明了函数的退出,而finally又必须要执行到,这就产生了矛盾。java最终的解释:finally胜出!

c++里并没有finally这种关键字,如果要实现类似finally的效果,可以用如下代码:

void main(void)
{
 try
 {
  //do something may throw exception
 }
 //do something else
 catch(CException* e)
 {
  //deal with exception
 }
 //do something finally
}

在do something finally段里,实际上不管是否抛出异常,都会运行到的。如果catch中有return,do something finally自然是运行不到的。而且,因为没有对finally的强制声明,不会出现java的矛盾。实际上,java也可以照方抓药,如此处理的。

这里,java定义finally主要是从程序员思想上强调这段代码不管是否有异常,在try结束后都要执行到,以便对一些资源进行回收。而c++则从机器的角度考虑,实际上finally只不过是流程中的一部分而已,只要控制好catch的时机,就可以让某段程序不管是否有异常,都可以跑到,至于具体的控制方式,全凭程序员的功力。

java和c++的这种思想上的区别还体现在很多地方,比如java的interface定义,在c++就没有专门的定义,而是以更加程序化的纯虚类声明,更加接近机器的表达方式。

此处仅仅是俺对两种语言的粗浅理解,有不当之处,敬请指责。

  评论这张
 
阅读(362)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017