`
trydofor
  • 浏览: 154192 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

码工魄之JAVA异常处理

阅读更多
码工魄之JAVA异常处理
作者:臭豆腐[trydofor.com]
日期:2009-12-16
授权:署名-非商业-保持一致 1.0 协议
声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

 

文档目录
1. 异常作用
如果把程序比作一棵树,那么,根系是需求,正常逻辑是主干,异常处理就是枝叶。
枝叶健康得当便有更多机会捕捉阳光雨露,歪斜则易断枝,过大还招风呢 ^_^)
因此,异常处理的好坏,恰当与否,都反映和影响着程序的健康状态与生命力。

JAVA异常有三大类,关系如下:[ST]
java.lang.Object
 |-java.lang.Throwable
    |-java.lang.Error
    |-java.lang.Exception
       |-java.lang.RuntimeException

第一类,是受检异常(checked exception)。
用来提示用户注意和适当的处理,是可预期的和修复的。

第二类,是错误(error),由java.lang.Error及其子类组成。
用来表示程序外部错误,一般不可预期和修复,比如硬件资源。

第三类,是运行时异常(runtime exception),
由java.lang.RuntimeException及其子类组成。
用来表示程序内部错误,一般不可预期和修复,比如程序bug。

2. 大师总结
“Effective Java 第2版”的第九章,专门讲了异常,提到的经验有。[EJ]
  • 第57条:只针对异常的情况才使用异常。
  • 第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常。
  • 第59条:避免不必要地使用受检异常。
  • 第60条:优先使用标准的异常。
  • 第61条:抛出与抽象相对应的异常。
  • 第62条:每个方法抛出的异常都要有文档。
  • 第63条:在细节消息中包含能捕捉的失败的信息。
  • 第64条:努力使失败保持原子性。
  • 第65条:不要忽略异常。

其中,
第60条指示我们,使用以下常用异常:
  • IllegalArgumentException    参数不合适
  • IllegalStateException       对象状态不合适
  • NullPointerException        禁止null
  • IndexOutOfBoundsException   下标越界
  • ConcurrentModificationException  并发修改
  • UnsupportedOperationException    操作为实现

第61条提到了异常链(exception chaining),经常用到的方法有:
  • Throwable getCause()
  • Throwable initCause(Throwable)
  • Throwable(String, Throwable)
  • Throwable(Throwable)
  • Throwable getStackTrace()
  • Throwable setStackTrace(StackTraceElement[])

3. 常用异常
对jdk1.6.0_16和spring-framework-3.0.0.RELEASE-with-docs.zip的源代码中使用
的异常进行了粗略的统计和排序,以下是过程和结果,也反映了第60条经验。

<tty> 异常的统计过程 
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
pwd
/home/trydofor/java
mkdir java6-src/
cd java6-src/
unzip ../src.zip
cd ..
unzip spring-framework-3.0.0.RELEASE-with-docs.zip
mv spring3-src/spring-framework-3.0.0.RELEASE spring3-src
ll
drwxrwxr-x  2 trydofor trydofor     4096 Dec 19 09:22 java6-src
drwxrwxr-x  2 trydofor trydofor     4096 Dec 19 09:23 spring3-src
-rw-rw-r--  1 trydofor trydofor 46699488 Dec 18 09:07 
                 spring-framework-3.0.0.RELEASE-with-docs.zip
-rw-rw-r--  1 trydofor trydofor 19641221 Jul 31 16:30 src.zip
find java6-src -name '*.java' |wc -l
7196
find spring3-src/projects/ -name '*.java'|wc -l
4093
#spring3-src/projects/org.springframework.expression/src/main/java/org/
#springframework/expression/common/TemplateAwareExpressionParser.java
#这个类是Mac下编写的,需要把 \r换成 \n 才能正确处理,否则整个文件当做一行处理。

find java6-src -name '*.java' |xargs cat | tr '\r' '\n'|
grep '[ \t\n]*throw[ \t\n]\+new' > java6.thrown.txt
find spring3-src/projects -name '*.java'|xargs cat | tr '\r' '\n'|
grep '[ \t\n]*throw[ \t\n]\+new' > spring3.thrown.txt
wc -l *.txt
 10959 java6.thrown.txt
  2994 spring3.thrown.txt
 13953 total

sed -n 's/.*throw[ \t]\+new[ \t]\+\([^(]\+\).\+/\1/p' java6.thrown.txt |
sort |uniq -c | sort -nr >java6.exception.txt
sed -n 's/.*throw[ \t]\+new[ \t]\+\([^(]\+\).\+/\1/p' spring3.thrown.txt |
sort |uniq -c | sort -nr >spring3.exception.txt

head java6.exception.txt
   2153 IllegalArgumentException
    795 NullPointerException
    438 RuntimeException
    295 UnsupportedOperationException
    291 DOMException
    280 IllegalStateException
    245 IOException
    219 IndexOutOfBoundsException
    185 ReadOnlyBufferException
    161 InternalError
head spring3.exception.txt
    574 IllegalStateException
    561 IllegalArgumentException
    217 UnsupportedOperationException
    128 RuntimeException
     66 InvalidResultSetAccessException
     62 SpelEvaluationException
     56 OperationNotSupportedException
     55 TransactionSystemException
     52 InvalidDataAccessApiUsageException
     47 ServletException

4. 低级习惯
  1. 作为流程控制。违法异常设计初衷。
  2. 私吞异常。包括空catch块或printStackTrace等伪处理。异常,要么处理好,要么不处理。
  3. 异常覆盖。catch或finally块内引发异常,覆盖源头问题,信息丢失。

<java> 异常转换与防覆盖 
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
boolean succeed = false;
List r = null;
S2AttributeReportDao dao = null;
try{
   dao = new S2AttributeReportDao();
   r = dao.getNewNameReportCandidates(jicAccountDate);
   succeed = true;
}catch(DaoException e){
   throw new ServiceException(e);
}finally{
   if(dao != null){
       try{
           dao.dispose();
       }catch(DaoException de){
           if(succeed){
               throw new ServiceException(de);
           }
       }
   }
}
return r==null?new ArrayList():r;

5. 参考资料
  • ST Sun的Java指南
  • EJ Effective Java 第2版(ISBN 978-7-111-25583-3,机械工业出版社)
5
2
分享到:
评论
3 楼 trydofor 2009-12-28  
想要哪方面的呢?
基本原则,大师都列出了。
具体操作,一般都和业务逻辑挂钩,不好开刀。
2 楼 bllizard 2009-12-26  
可以说的再具体些吗?
1 楼 hanjiangit 2009-12-22  
继续说啊~~~

相关推荐

    java异常处理习题

    Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...

    Java论文异常处理论文:JAVA异常处理的分析与研究.doc

    Java 异常处理论文:JAVA 异常处理的分析与研究 Java 异常处理是 Java 语言的一大特色,该文在介绍 Java 语言的异常处理技术的基础上,提出了异常处理的设计原则,从而为 Java 的程序设计实现提供技术上的借鉴。 ...

    java异常处理练习题

    java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验

    14.java异常处理机制.zip

    14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理...

    Java异常处理策略研究.pdf

    Java 异常处理机制是 Java 语言的重要标志之一,在程序设计过程中用来处理程序运行中的异常。Java 异常处理机制可以分为三部分:try 块、catch 块和 finally 块。try 块用于检测异常,catch 块用于捕获和处理异常,...

    java异常处理ppt

    此文档主要讲解了java异常处理的基本问题,适合初学者,比较详细,有范例,有讲解.

    Java异常处理机制应用研究.pdf

    本文将详细介绍 Java 异常处理机制的应用研究,包括 Java 异常体系统结构、异常分类与处理机制、异常处理的一般原则和异常处理框架等。 Java 异常体系统结构 Java 异常体系统结构如图 1 所示,Throwable 是所有...

    深入探索 高效的Java异常处理框架

    什么时间使用runtimeException,什么时间使用Exception,大家有没有被困扰到?经整理,JAVA异常处理框架,以及如何构造自己的异常体系,讲得比较详细,值得一看。

    Java异常处理和最佳实践(含案例分析).pdf

    因此,本文将从字节码层面分析Java的异常处理机制,探讨为什么finally块中的代码总是会执行,为什么推荐使用try-with-resources关闭资源等问题。 二、Java异常处理机制 1、Java异常分类 Java中的异常可以分为两大...

    java异常处理试题及答案.doc

    本文档提供了 Java 异常处理试题及答案,涵盖了异常处理的基本概念、关键字、异常类继承关系、异常处理的出口、多重 catch 块、异常抛出和捕捉等知识点。 一、Java 异常处理的基本概念 * 异常是一种对象,所有异常...

    java异常处理机制

    java异常处理机制,异常的概念,发生的原因,throwable,捕获异常的简单思维导图

    JAVA的异常处理(超详细说明)Java异常处理

    JAVA的异常处理(超详细说明)Java异常处理

    java 异常框架CODE

    Java异常框架是Java编程语言中处理程序运行时错误和异常的核心机制。在Java中,异常是一种特殊的对象,用于表示程序运行过程中的不正常状态。Java的异常处理模型基于\"异常处理块\",包括try、catch、finally和throw...

    深入理解java异常(异常中的Error+异常中的Exception+检查异常+运行时异常+异常处理+throws关键字等)

    Java 异常机制包括 Error、Exception、检查异常、运行时异常、异常处理和 throws 关键字等几个方面。 Error 是 Java 异常机制中的基类,表示编译时或者系统错误,例如虚拟机相关的错误、系统崩溃等。Error 无法恢复...

    Java自定义异常处理

    Java自定义异常处理详细介绍,包括了很多比较经典的案例,可以自己研究自定义异常

    Java异常与错误处理中英文翻译

    ### Java异常与错误处理 #### 引言 Java设计的核心理念之一是“结构不佳的代码将不能运行”,这意味着尽可能在编译阶段捕获错误,确保代码的健壮性与可靠性。然而,即使编译器再强大,也无法检测出所有潜在的运行...

    基于JAVA常见异常处理研究.pdf

    基于JAVA常见异常处理研究 JAVA异常处理是JAVA语言的重要机制,正确、合理地处理异常对电脑的稳定性和安全性有着极为重要的作用。异常主要有三类,包括异常处理语句的定义、捕捉异常和程序流程跳转等。 一、 JAVA ...

    【Java从入门到放弃 之 从字节码的角度异常处理】文章中的字节码

    在深入探讨Java异常处理机制的底层细节时,我们通常需要借助字节码分析来获得更深层次的洞见。字节码是Java源代码在Java虚拟机(JVM)上执行的中间形式,它在编写Java程序和JVM执行之间起到桥梁的作用。通过分析字节码...

    Java异常故障模式分析.pdf

    Java 异常处理机制是 Java 语言的重要特征之一。正确使用异常处理机制可以使程序的设计更加安全、可靠,但如果使用不当,則会让程序变得复杂难懂,从而影响程序效率。本文对 Java 异常处理方面容易出现的故障模式...

Global site tag (gtag.js) - Google Analytics