首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

JAVA高级--Java中异常机制的深入研究

http://www.oklinux.cn  2008-01-20  来源: ccidnet baocl  会员收藏  游客收藏  【 】 

由于本文旨在探讨Java"异常机制"的深层原理,因此关于"异常"的使用方法都不做具体说明。首先看一段非常熟悉的用于打开一个文件的C程序段:

  FILE *fp;

  fp=fopen(filename,"rw");

  if(fp==NULL){

  printf("cannot open file\n");

  exit(0);

  }

  在这段程序中,if条件语句中的一段用来处理没有找到指定文件,或者其它原因无法正确打开指定文件。可是假如碰到一个责任心不强的程序员,他可能认为出现找不到文件的可能性很小,或者由于思路集中在程序功能的实现上而忘记了处理这种情况。这时程序同样可以正确编译,而且一般情况下也不会出现问题。但此时这段程序可以肯定说是不够健壮的,而且一旦这段程序发生了错误也会让程序员很难发现错误出在哪里。在C语言以及其它大多数高级语言中都可以举出很多这种例子。

  也就是一个函数在使用的时候,可能会出现并没有达到这个函数的使用目的的情况,哪怕在这段程序的特定使用环境下发生这种异常情况的可能性只有万分之一。常用处理的方法就是,程序员在需要使用某个函数时必须充分了解可能会有什么原因导致该函数不能正确执行,然后加入相应的条件判定语句来进行处理。后面将有一个例子说明这个问题。

  而Java的"异常机制"就是在处理上述问题中给了程序员非常简单而灵活的方式。一般来说,其它高级语言主要是让函数使用者来关注该函数可能会出现的异常情况,而java则是把这件事情交给方法(和函数对应的概念,在Java中称方法)的设计者来做。这对于方法的使用者来说带来的方便是不会因为责任心不强,或者办事丢三那四,会忘了在使用方法时处理可能发生的异常情况。而麻烦就是,在使用一个可能会发生异常的方法时,绝对不能视而不见,而必须做出相应的处理。也就是说象上述C程序段中,假如忘了if程序块,这个程序甚至还能蒙过一个外行上司,但当使用Java来完成这个功能时,只要用到的方法使用了"异常"机制,假如不对可能产生"异常"的方法进行相应处理,java编译器是不会让其通过的。

  一、"异常类"的组织形式

  Java系统类中的方法产生的异常都被组织成"异常类"(还有Error类,不在本文讨论范围),此方法和它相关的"异常类"通过throws要害字关联在一起,并且这些类都必须是Exception类的子类。任何一个自己开发的类的方法中假如可能会产生某种异常,也可以将这种异常组织成一个"异常类",但这个"异常类"同样必须是Exception的子类,或孙子类等等。

  例1:

  /*isLegal于检查数据是否合法,当>0时视为合法,返回合法值,

  *否则视为不合法,抛出"异常".*/

  int isLegal(int dt) throws LowZeroException//这种定义本文中均称为方法与"异常"通

  {                  //过throws建立了关联

  if(dt>=0){

  return data;

  }

  else

  throw new LowZeroException();

  }

  /*自已写的异常类,继续自Exception*/

  class LowZeroException extends Exception

  {

  public LowZeroException(){

  super();

  }

  }

  仔细观察方法isLegal(),它体现出的最值得注重的特色是,它有两种方式的函数出口,一种是通过return语句,返回的是方法本身定义的类型的实例,另一种是通过throw,返回的是"异常类"的对象实例,Java中称之为抛出"异常".对比一下C中如何处理同样的问题的:

  int isLegal(int dt) {

  if(dt>=0){

  return data;

  }

  else

  return -1;//通过一个特定值来表明出错

  }

  由于C只能通过return返回函数值,所以在处理异常情况时则可能通过以上方式来处理。当然这就要求isLegal()函数的使用者必须知道函数中使用返回值-1来表明出现不合法数据的情况。

  对比这两种处理方法,可以知道java的"异常机制"把处理异常事件的职能和方法本身的职能通过两个不同出口分离开来。

  所有这些"异常类"独立于它具体服务的方法被统一组织成一个类树。"异常机制"就好比高校的后勤社会化一样,通过后勤社会化将学校的教学职能和学校的后勤保障分离开来,并且后勤集团的组织形式也是独立于学校主体的。事实证实,这种组织方式不仅提高了服务效率,也提高了服务质量。整个Java体系中的"异常类"组织形式如图1所示:

  在例1中的isLegal()方法假如在调用过程中没有能正常返回整形数,而是在"异常"产生点产生了"异常"对象,那么这个"异常"对象由谁来接收,并处理它呢?以下就来解答这个问题。

  二、"异常"的处理过程

  Java中由try…catch语法来处理"异常",将关联有"异常类"的方法包含在try{}程序块中,catch(){}要害字可以使用形参,用于和方法产生的"异常"对象结合。当调用某个方法时,引起异常事件发生的条件成立,便会抛出"异常",原来的程序流程将会在此方法处中断,然后try模块后紧跟的catch中的"形参"和此异常对象完成了结合,继而进入了catch模块中运行。具体过程举例说明:

  例2:

  /*将关联有异常的方法包含在try模块中*/

  int myMethod(int dt){

  int data = 0;

  try{

  int data = isLegal(dt);

  }catch(LowZeroException e){

  System.out.println("发生数据错误!");

  }

  return data;

  }

  三、"异常"的处理方法

  有两种方法处理"异常":第一种如例2,将含有"异常"出口的方法直接放到try块中,然后由紧随其后的catch块捕捉。第二种是不直接监听捕捉被引用方法的"异常",而是将这个"异常"关联传递给引用方法,同时监听捕捉工作也相应向上传递。

  例3:

  int myMethod2(int dt)

  {

  int data = 0;

  try{

  data = myMethod(dt)

  }catch(LowZeroException e){

  System.out.println("发生数据错误!");

  e.printStackTrace();

共2页: 上一页 1 [2] 下一页

上一篇:Java语言常用VI高级命令集锦   下一篇:一个基于Java Socket实现文件传输示例


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Java语言常用VI高级命令集锦
·一个基于Java Socket实现文件传输示例
·Java语言对象池技术的原理及其实现解析
·JAVA进阶--使用Java进行Web开发的随想
·Java进阶--减少对象的创建提高java性能
·Ajax技术:构建动态的Java应用程序分析
·JAVA基础:一个struts hibernate入门实例
·JAVA进阶--根据所涉及对象生成XML文档
·JAVA进阶--对象的序列化和反序列化实践
·Java基础:编写对GC友好,又不泄漏的代码
·对Map技巧的一点总结:获得Map中的数据
·Java进阶-编写跨平台Java程序注意事项
·学习Java用于异常处理的terminate()函数
·使用isInstanceOf()测试程序对象的类型
·spring 2.0自定义xml 标记 (一 相关类)
·Java Interface 是常量存放最佳地点吗?
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java入门:状态对象--数据库的替代者
·Java语言怎样调用外部应用程序
·Java语言深入--关于Java语言的内存泄漏
·JSP/Servlet/JSF:Servlet/JSP配置详解
·进阶-怎样使用AJAX进行WEB应用程序开发
·基础:J2ME程序开发之新手入门九大要点
·Java入门--Java语言接口与继承的本质
·JAVA进阶--如何提升JSP应用程序的效率
·对Java中四种XML解析技术之不完全测试
·编写高级 JScript应用代码
·JSP/Servlet/JSF--对标签库的深入研究
·Java入门--关于字符串分割的两种方法
  阅读排行
·使用AJAX技术实现网页无闪自动局部刷新
·快速教您Apache Tomcat SSL的配置
·Java语言深入--java调用C/C 的过程
·用JSP JavaScript打造二级级联下拉菜单
·JAVA进阶--线程运行栈信息的获取讲解
·J2SE综合--JAVA实现把汉字转化成拼音
·使用WEBWORK实现文件上传方法实例详解
·一个非常有趣的使用spring框架AOP例子
·关于java中相对路径,绝对路径问题总结
·高级:lucene全文检索应用示例及代码简
·详细讲解Struts构架中action的跳转大全
·Hibernate配置文件中的映射元素详解
·在Weblogic上配置JMS服务的方法
·对Java中四种XML解析技术之不完全测试
·数据库相关:小结Hibernate的查询方式
网摘收藏: