异常的捕获

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块必须要与try或try/catch配套使用,另外,也不能先退出try块而不执行finally块。如果finally块存在,则它总是会被执行的。但是有一种方法可以退出try块而不执行finally块。如果try内部是一条System.exit(0);语句,则应用程序被终止,finally语句也不被执行。还有一种情况就是如果在try块执行期间突然断电,finally也不会被执行。)

结束语:

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

C++与Java异常处理的区别相关推荐

  1. Java异常处理12条军规

    摘要: 简单实用的建议. 原文:Java异常处理12条军规 公众号:Spring源码解析 Fundebug经授权转载,版权归原作者所有. 在Java语言中,异常从使用方式上可以分为两大类: Check ...

  2. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  3. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)

    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...

  4. java提供两种处理异常的机制_浅析Java异常处理机制

    关于异常处理的文章已有相当的篇幅,本文简单总结了Java的异常处理机制,并结合代码分析了一些异常处理的最佳实践,对异常的性能开销进行了简单分析. 博客另一篇文章<[译]Java异常处理的最佳实践 ...

  5. java异常处理试题答案_Java 面试题和答案 - (下)

    第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处理,Java小应用程序,Swing,JDBC,远程方法调用(RMI),Servle ...

  6. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  7. Java提高篇——Java 异常处理

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

  8. Java 异常处理的误区和经验总结

    本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...

  9. Java异常处理总结

    Java异常处理总结           异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制 ...

最新文章

  1. AI程序员,所有码农的梦想
  2. 程序员因拒绝带电脑回家被开除,获赔 19.4 万元
  3. ubuntu 配置 jdk 环境
  4. 【AI白身境】学深度学习你不得不知的爬虫基础​​​​​​​
  5. SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)
  6. mysql引擎模式_mysql引擎,完整的见表语句,数据库模式, 常用数据类型,约束条件...
  7. 电大计算机机考excel,中央电大计算机应用机考excel电子表格模板题库存(118页)-原创力文档...
  8. TypeError: softmax() got an unexpected keyword argument 'axis'
  9. jQuery ui widget和jQuery plugin的实现原理简单比较
  10. rownum的用法oracle
  11. newaxis取出某一行或列数据以及增加维度
  12. linux mysql 相关操作、问题
  13. 类文件结构和字节码指令
  14. 移动APP开发框架盘点
  15. lldb调试mysql 插件命令
  16. 无锡江苏高性能服务器服务商,无锡高防云服务器
  17. Java是如何存储元素的(3)—Map集合存储数据原理(为什么HashMap集合的key部分的特点是无序,不可重复)
  18. last-winner-airdrop
  19. navicat连接mysql1205报错
  20. outlook邮箱撤回邮件

热门文章

  1. day02-虚拟环境安装
  2. Socket通讯成功案例
  3. 如何用Map对象创建Set对象
  4. [Django学习] Django基础(5)_优化分页器
  5. Java经典设计模式-创建型模式-单例模式(Singleton)
  6. 提高网站打开速度的7大秘籍
  7. OpenGL.ProjectiveTextureMapping
  8. 开机、问题-MocorDroid拔掉电池开机比正常关机后开机慢1分钟问题-by小雨
  9. Amazon.com 和 store.apple.com 哪个的购物体验更好?
  10. linux--history命令