`
trydofor
  • 浏览: 150640 次
  • 性别: 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异常处理零基础学Java异常处理零基础学Java异常处理...

    高效java异常处理机制

    在Java编程中,异常处理是程序健壮性的重要组成部分,它确保了程序在遇到错误时能够优雅地处理问题,而不是突然崩溃。本文将深入探讨Java的异常处理机制,结合"Effective Java Exceptions"文档中的观点,来揭示如何...

    java全局异常统一处理

    在Java中,全局异常统一处理是一种常见的错误处理模式,它允许在一个单独的地方集中处理应用程序中抛出的所有异常。这种处理方式有助于简化代码,提高代码的可读性和可维护性。 要实现全局异常统一处理,Java提供了...

    java异常处理ppt

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

    java开发异常处理与日志规范

    Java开发中的异常处理和日志规范对于保持代码的健壮性和可维护性至关重要。下面将详细阐述这些要点: 1. **避免捕获可预检查的RuntimeException**:在Java中,像NullPointerException和IndexOutOfBoundsException...

    C++与java异常处理

    简单,易懂的方式讲解C++与java异常处理的方法,两者的异同

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

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

    Java异常处理机制及应用.pdf

    Java 异常处理机制及应用 Java 异常处理机制是一种重要的技术,它能够帮助开发者处理 Java 语言中的错误和异常,从而提高程序的可靠性和稳定性。本文将从 Java 异常处理机制的原理、分类、抛出和捕获机制、原则等...

    java异常处理.xmind

    java异常处理思维导图,自己根据尚硅谷的视频总结的思维导图,主要针对容易遗忘的知识点,方便自己记忆

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

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

    Java异常处理机制及其在项目中的应用.pdf

    Java 异常处理机制及其在项目中的应用 Java 异常处理机制是 Java 语言中的一种错误捕获机制,用于处理程序中的错误和异常。Java 异常处理机制可以分为两大类:Checked Exception 和 Unchecked Exception。Checked ...

    JAVA的异常处理机制

    JAVA的异常处理机制 java学习,值得学习

    java异常处理机制

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

    Java异常处理及应用.docx

    Java 异常处理是 Java 语言的核心组件之一,它是 Java 语言健壮性的一个重要体现。Java 把异常当作对象来处理,并定义一个基类 java.lang.Throwable 作为所有异常的超类。在 Java API 中已经定义了许多异常类,这些...

    Java异常处理.md

    Java异常处理机制是一种用于有效管理程序运行时错误的方法。在Java中,通过try、catch和finally语句来实现异常捕获与处理: 1. **基础异常捕获**: - 当代码执行过程中出现如除数为零的`ArithmeticException`等...

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

    Java异常处理是编程中至关重要的一个环节,它用于在程序执行期间处理错误和不正常的情况。本文深入探讨了高效Java异常处理框架,旨在提高代码的健壮性和稳定性。首先,文章介绍了异常的基本概念和Java异常体系结构。...

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

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

    Java异常处理机制的静态编译实现与优化

    作为两款被广泛使用的面向对象语言,C++和Java语言都支持异常处理机制。异常处理机制通常由编译器和异常处理机制的运行时支持函数共同实现,因此,如何正确高效地实现异常处理机制是设计编译器和异常处理运行时支持函数...

Global site tag (gtag.js) - Google Analytics