动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.制作类似于Title、ALT的提示效果.
.Function 对象.
.this关键字.
.Java高级编程:提升JSP应用程序的.
.J2ME 2D小游戏入门之游戏的框架.
.我的Java培训与学习之路.
.java字符串的简单介绍.
.简单客户系统的权限控制实现.
.关于手机游戏中的炮弹轨迹—抛物.
.hibernate的hello word(国内高手.
.Java对Domino Objects的访问 (5.
.java开发之Flash remoting调用se.
.Java中鲜为人知的缺点(上).
.weblogic6.0使用心得.
.JAVA与正则表达式(2年级之1).
.预装载以及JavaScript Image()对.
.深入equals方法.
.一个根据筛选法求出100以内的所有.
.Struts中不同的Action和ActionFo.
.JBuilder2005实现重构之重命名.

Java编程中异常处理的优劣之道

发表日期:2008-1-5 |


  Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理。不过,我认为很多人其实并没有真正把握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道点概念。本文就对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:

  好,不好和恶劣三种。

  同时向你提供了一些解决这些问题的技巧。

  首先解释一些java异常处理中必须搞清楚的定义和机制。Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作“不可检查”(Unchecked)异常;其他所有异常则称作“可检查”(Checked)异常。

  所谓可检查异常,是指我们应该自行处理的异常。至于处理的手段,要么加以控制(try catch),要么通告(throws)他们有可能产生。通常,应捕捉那些已知如何处理的异常,而通告那些不知如何处理的异常。

  而对那些不可检查异常来说,他们要么在我们的控制之外(Error),要么是我们首先就不该答应的情况(RuntimeException).

  至于异常的指定,Java的规则非常简单:一个方法必须通告自己可能产生的所有可检查异常。编写自己的方法时,并不一定要通告出方法实际可能产生的每一个异常对象,要想理解什么时候必须要方法的throws丛句来通告异常,就必须知道对一个异常来说,他只有可能在下面四种情况下才会产生:

  1.调用了可能产生异常的方法。比如BufferedReader类的readLine方法。该方法通告java.io.IOException异常

  2.侦测到一个错误,并用throw语句产生异常。

  3.出现一个编程错误。比如a[-1] = 0。

  4.Java产生内部错误。

  假如出现头两种情况之一,必须告诉打算使用自己方法的人:假如使用这个方法,可能造成一个异常的产生(即在方法头上使用throws),一个简单的记忆方法:

   只要含有throw,就要通告throws。假如一个方法必须同时处理多个异常,就必须在头内指出所有异常。就像下例展示的那样,用逗号对他们进行分割:

1
2
3
4
5
6
7
class Animation  
{ 
  public Image loadImage(Strint s)  throws EOFException,MalformedURLException  
  { 
   ………… 
  } 
} 
      

  然而,我们不需要通告内部java错误,也不应该通告自RuntimeException衍生出来的异常。

  好的异常处理

  好异常处理提供了处理程序错误的统一机制。事实上,Java语言通过向调用者提出异常警告的方式而显著地提升了软件开发中的异常处理能力。这种方式把Java语言中的“方法(method)”进行了扩展和增强,使之包括了自身的错误条件。下面就让我们看一个例子,这个例子说明了这种情况。

  以下是FileInputStream构造器之一的原型:

public FileInputStream(String name) throws FileNotFoundException Java

  的方法和构造器必须声明他们在被调用时可能“扔出”的异常,采用的要害字就是“throws”。这种在方法原型中出现的异常提示增加了编程的可靠性。

  显而易见,这种方式是向方法的调用者提示了可能出现的异常条件,这样调用者就可以对这些异常作出适当的相应处理。以下代码示意我们是如何捕捉并且处理FileNotFoundException 这一异常的:

1
2
3
4
5
6
7
8
9
10
11
try  
{   
    FileInputStream fis = new FileInputStream(args[0]);     
    // other code here ...   
}  
catch (FileNotFoundException fnfe)  
{  
    System.out.println("File: " + args[0] + " not found. Aborting.");  
    System.exit(1);  
 } 
      

  Java异常处理还有其他一些优秀的特性,这就是可检查异常、用户定义异常和在JDK 1.4中推出的新型Java记录API(Java Logging API)。java.lang.Exception的所有子类都属于可检查异常。可检查异常(checked exception)是扔出该异常的方法所必须提示的异常,这种异常必须被捕捉或者向调用者提示。用户定义异常(User-defined exceptions)是定制的异常类,这种异常类扩展了java.lang.Exception类。优良的Java程序规定定制异常封装、报告和处理他们自己独有的情况。最新的Java记录API(logging API)则可以集中记录异常。


  不好的Java异常处理

  不好的一面包括两种情况:滥用不可检查异常(unchecked exceptions)和滥用catchall构造器等。这两种方式都使得问题变得复杂起来。

  有一种类别的异常属于RuntimeException的子类,这种异常不会受到编译器的检查。比如,NullPointerException和 ArrayStoreException就是这种类型异常的实例。程序员可以对RuntimeException进行子类化以回避检查异常的限制,从而便于产生这些异常的方法为其调用者所使用。

  专业的开发团队应当只答应在很少的情况下才可以这样做。

  第二种异常处理的陋习是catchall构造器。所谓的“catchall 构造器”就是一种异常捕捉代码模块,它可以处理所有扔给它的可能异常。

  以下是catchall处理器的实例:

1
2
3
4
5
6
7
8
9
 try 
 {  
    // code here with checked exceptions 
 } 
 catch (Throwable t)  
 {  
     t.printStackTrace();  
 } 
      

  我得承认,我自己在编写一般程序的时候就曾经用过这种技术;但是,在编写要害程序的时候这种类型的构造器一定要避免使用,除非他们被授权可以和中心错误处理器联合使用才可以这样做。 

  除此之外,catchall构造器不过只是一种通过避免错误处理而加快编程进度的机制。

  异常处理的一个不足之处是难以采用优良的错误处理策略。从低容内存状态恢复、写入错误和算法错误等异常情况都不是轻易能得到解决的。你可以尝试一下循环、垃圾收集和提醒用户等常用技术来应付以上的局面。

  恶劣的处理方法

  和许多Java特性及其API类似,Java的异常处理机制也有“霸王硬上弓”类的滑稽错误。比方说,为了扔出某个异常竟然毫不犹豫地用“new”要害词为其分配内存就是这样的例子。

  我自己不知道有多少次就因为犯了这种错误而在严厉的编译器面前屡屡碰壁。在这种情况下,我们其实都是在伺候语言而不是让语言为我们所用。还有我们碰到的OutOfMemoryErrors就是异常处理的缺陷。这一处理过程是:

  使用finally模块关闭文件,解析异常以得到出现问题的方法和代码行。在这一过程之内最大的缺陷是需要捕捉OutOfMemoryError,而这一异常却并不是可检查异常!想想看,内存耗尽是相当常见的情况。任何与内存使用状态紧密相关的程序都应当捕捉和处理这一错误。

  使用异常时的一些建议

  1.异常控制的设计宗旨并不是用来代替一些简单的测试。只有在异常情况下才使用异常!

  2.不要过分细化异常。不要在每个语句上都加上异常处理,最好将整个任务都放在try块内。假如其中有一项操作失败,可以随即放弃任务。

  3.不要“压制”异常。对于需要通告异常的方法,我们可以改用捕捉的方法来将异常强行关闭,假如真的出现异常,那个异常会被“静静静”的忽略。假如觉得产生的异常会非常重要,就必须多费些功夫,对其进行正确的控制。

  4.不要介意异常的传递。假如调用的方法会产生异常,比如readLine方法,他们天生就能捕捉自己可能产生的异常,在这种情况下,一种更好地做法是将这些异常传递出去,而不是自己动手来捕捉它。
上一篇:JRuby:集Java与RoR之所长 人气:646
下一篇:Java技术在多数据库系统中的应用研究 人气:556
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-4 PhpCMS2008 bulid 081203 简体中
2008-12-4 Menalto Gallery v1.5.10 多国语
2008-12-4 Phpcms2008 bulid 081203 简体中
2008-12-4 乘风多用户计数器 v3.92 (Acc)
2008-12-4 乘风多用户计数器 v3.92 (Sql)
2008-12-4 BBSxp 2008 8.0.5 SP2 Build 081
2008-12-4 ASBLOG v2.5 bulid 081118(1201)
2008-12-4 非零坊幽默短信 v3.4
2008-12-4 红茶巴士(公交)查询系统 v3.0
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号