当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

<b>Java非常处理的陋习展播</b>[Java编程]

赞助商链接



  本文“<b>Java非常处理的陋习展播</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

你认为自己是一个Java专家吗?能否必定自己已经全面掌握了Java的非常处理机制?在下面这段代码中,你可以疾速找出非常处理的六个问题吗?

1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ⑸
4  Statement stat = conn.createStatement();
5  ResultSet rs = stat.executeQuery(
6   "select uid, name from user");
7  while (rs.next())
8  {
9   out.println("ID:" + rs.getString("uid") // ⑹
10    ",姓名:" + rs.getString("name"));
11  }
12  conn.close(); // ⑶
13  out.close();
14 }
15 catch(Exception ex) // ⑵
16 {
17  ex.printStackTrace(); //⑴,⑷
18 }

作为一个Java程序员,你至少应当可以找出两个问题.但是,假如你不能找出全部六个问题,请持续阅读本文.

本文谈论的不是Java非常处理的普通性原则,因为这些原则已经被大大都人熟知.我们要做的是解析各种可称为“反例”(anti-pattern)的违反优异编码标准的常见坏习惯,帮忙读者熟习这些典型的背面例子,从而可以在实际工作中灵敏地发觉和避免这些问题.

反例之一:丢弃非常

代码:15行-18行.

这段代码捕捉了非常却不作任何处理,可以算得上Java编程中的杀手.从问题呈现的频繁程度和祸殃程度来看,它也答应以和C/C++程序的一个恶名远播的问题相提并论??不查抄缓冲区能否已满.假如你看到了这种丢弃(而不是抛出)非常的情形,可以百分之九十九地必定代码存在问题(在极少数情形下,这段代码有存在的来由,但最好加上完好的注释,免得惹起别人曲解).

这段代码的错误在于,非常(几近)老是意味着某些事情不对劲了,大概说至少发生了某些不平常的事情,我们不该该对程序发出的求救信号保持沉默和无动于衷.调用一下printStackTrace算不上“处理非常”.不错,调用printStackTrace对换试程序有帮忙,但程序调试阶段完毕之后,printStackTrace就不该再在非常处理模块中担负主要责任了.

丢弃非常的情形非常广泛.翻开JDK的ThreadDeath类的文档,可以看到下面这段阐明:“分外地,固然呈现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为很多利用会捕捉全部的Exception然后丢弃它不再答理.”这段话的意思是,固然ThreadDeath代表的是一种普通的问题,但鉴于很多利用会试图捕捉全部非常然后不予以得当的处理,所以JDK把ThreadDeath定义成了Error的子类,因为Error类代表的是普通的利用不该该去捕捉的严重问题.可见,丢弃非常这一坏习惯是如此常见,它乃至已经影响到了Java本身的计划.

那么,应当怎样改正呢?主要有四个挑选:

1、处理非常.针对该非常采纳一些行动,比方改正问题、提醒某个人或举行其他一些处理,要按照具体的情形肯定应当采纳的行动.再次阐明,调用printStackTrace算不上已经“处理好了非常”.

2、重新抛出非常.处理非常的代码在解析非常之后,认为自己不能处理它,重新抛出非常也不失为一种挑选.

3、把该非常转换成另一种非常.大大都情形下,这是指把一个初级的非常转换成利用级的非常(其含义更简单被用户理解的非常).

4、不要捕捉非常.

结论一:既然捕捉了非常,就要对它举行得当的处理.不要捕捉非常之后又把它丢弃,不予答理.

反例之二:不指定具体的非常

代码:15行.

很多时刻人们会被这样一种“美好的”设法吸引:用一个catch语句捕捉全部的非常.最常见的情形就是利用catch(Exception ex)语句.但实际上,在绝大大都情形下,这种做法不值得倡导.为什么呢?

要理解其缘由,我们必须回想一下catch语句的用处.catch语句表示我们预期会呈现某种非常,并且但愿可以处理该非常.非常类的作用就是奉告Java编译器我们想要处理的是哪一种非常.由于绝大大都非常都直接或间接从java.lang.Exception派生,catch(Exception ex)就相当于说我们想要处理几近全部的非常.

再来看看前面的代码例子.我们真正想要捕捉的非常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的非常.另一个大概的非常是IOException,因为它要操作OutputStreamWriter.明显,在同一个catch块中处理这两种截然差别的非常是不符合的.假如用两个catch块辨别捕捉SQLException和IOException就要好多了.这就是说,catch语句该当尽大概指定具体的非常范例,而不该该指定涵盖范围太广的Exception类.

另一方面,除了这两个特定的非常,还有其他很多非常也大概呈现.比方,假如由于某种缘由,executeQuery返回了null,该怎么办?答案是让它们持续抛出,即没必要捕捉也没必要处理.实际上,我们不能也不该该去捕捉大概呈现的全部非常,程序的其他地方还有捕捉非常的机会??直至最后由JVM处理.


  以上是“<b>Java非常处理的陋习展播</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .