C++与Java异常处理的区别

异常的捕获

1) Java中的异常捕获

Java中异常捕获有以下几种方法:

1.1        try…catch…块  

try来设定一段能够预防所有异常的程序。紧跟在try后面,可以有一个或多个catch子句来指定我们想要捕获的异常类型。

try…catch的格式一般为:    

try{…}

catch(…){        }

catch(…){          }

Catch子句的目标是解决异常情况,把变量设到合理的状态,就像没有出错一样继续运行。如果一个子程序不处理没个异常,则返回到上一级处理,如此可以不断的递归向上直到最外一级.   

例如:    

try{ int a=100/0;}

catch(Exception e){ System. out. Println (e .getMessage()) ;} 

上面这个程序中,首先,使用try来设定一个潜藏着异常的程序’int a=100/0”,接着使用catch语句来捕获这个异常。Catch子句的任务就是解决异常,把变量调整到一个相对来说比较合理的状态上,可以使程序像没有出错一样照常进行。当一个子程序不处理这个异常时,则要返回上一级继续处理,如此递归直到最外一级。实际上,java程序在激发一个异常的程序时,只是激发了一个对象而已,而在Java中只有Throwable这个超类的对象可以被激发。throwable类中包含了很多方法,上述例子中getMessage()方法就是其中一个,它的功能是打印出异常对应的信息。

这与C++中的try…catch语句一样:

例如:

void f(){throw ExceptionClass(“I’m a girl!”);}

                  try{f()}catch(ExceptionClass e){e.function()};

需要我们注意的是:在try{f()}catch(…){}语句中。Catch后面的表示所有可以捕获的异常。这样我们可屏蔽掉所有没出现处理的异常。当异常捕获之后,我们可以用throw语句再一次抛出,只不过现在这个throw语句不带有任何参数,如: try(f())catch(…){throw()}

1.2.try…catch…finally

在这个固定的程序块中,finally关键字起着很重要的作用,这也是C++Java的最大的区别,因为C++中不存在finally块,因此在这儿我们只需要对Java中的finally块详细探讨一下。

我们知道,finally可以保证Java程序不管发生什么异常,总会使代码照常执行,这是对Java异常处理块的最佳补充。还有一点值得一提就是, finally可以维护对象的内部状态,还可以清理非内存资源。如果您不使用finally那么您必须编写代码来释放那些非内存资源:    

例如:

classWithoutFinally  {   

publicvoidfoo1()throwsIOException  {//在任一个空闲的端口上创建一个套接字    

ServerSocketss=newServerSocket(0);    

try{     

Socketsocket=ss.accept();     //此处的其他代码...   

}    

catch(IOExceptione){ ss.close();   //1   

 throw();    } //抛出异常;    

ss.close();   //2  

}  

}  

在以上这段程序中,我们首先创建了一个套接字,然后在try语句中调用accept方法,但是必须保证在退出这个方法之前关闭这个套接字,以防止资源出现漏洞。紧接着,我们调用close方法来完成这项任务。但是,一旦在try块中出现一个异常,我们该怎么办呢?因此,我们必须捕获这个异常,并在重新发现这个异常之前,在//1处插入对close的另一个调用。这样就可以确保在退出该方法之前关闭该套接字。

 我们发现上面这段程序很烦索而且潜藏着很多错误,但是,finally子句可以解决这个问题。下面是上述例子加了finally语句之后的程序代码:

 classWithFinally  {   

publicvoidfoo2()throwsIOException;   

{ //在任一个空闲的端口上创建一个套接字;    

ServerSocketss=newServerSocket(0);    

Try{ 

Socketsocket=ss.accept();  }    

finally{ ss.close();    

}   

}  

}  

在程序中加入finally块不管try块内是否发出异常,都可以确保close方法总被执行。并且可以确保在退出该方法之前close方法总被调用。这样我们就可以保证该套接字被关闭并且还防止了资源的泄漏。我们注意到,在此方法中有try语句,而没有发现catch语句的影子,这是因为第一个示例中提供catch块只是为了关闭套接字,但现在finally已经完成该任务了,所以再加catch就是多余的。但是如果您在程序必须使用一个catch块,则finally块中的代码会在catch块后执行。    

在这里我需要强调的一点是,在Java中进行异常处理时,finally块必须要与trytry/catch配套使用,另外,也不能先退出try块而不执行finally块。如果finally块存在,则它总是会被执行的。但是有一种方法可以退出try块而不执行finally块。如果try内部是一条System.exit(0);语句,则应用程序被终止,finally语句也不被执行。还有一种情况就是如果在try块执行期间突然断电,finally也不会被执行。)

结束语:

因此,当我们在进行程序设计时,如果我们所设计的程序中存在着一些异常,我们最好使用Java来进行程序设计,因为Java中的finally在异常处理过程中起着至关重要的作用。它不仅可以保证该套接字被关闭并且还防止了资源的泄漏。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值