Java自定义Exception

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

原文地址:http://my.oschina.net/liuzeli/blog/351280

这里总结一下Java的Exception,并实现一个自定义Exception类。

总结:

  1. Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常)。
  2. Exception细分成两种异常:受检查异常(如,IOException, SQLException等。在编译时要被强制检查的异常,需要用try, catch, finally关键字在编译时期处理,否则会报错。);运行时异常(如,ArithmeticException, ClassCastException, IllegalArgumentException, IndexOutOfBoundsException, NullPointerException等。编译器不会检查这类异常。)
  3. Java编程中处理异常的最佳实践[4]:
  • 为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。
  • 在finally程序块中关闭或者释放资源
  • 在堆栈跟踪中包含引起异常的原因
  • 始终提供关于异常的有意义的完整的信
  • 避免过度使用检查型异常
  • 将检查型异常转为运行时异常
  • 记住对性能而言,异常代价高昂
  • 避免catch块为空
  • 使用标准异常
  • 记录任何方法抛出的异常

受检查异常和运行时异常的区别:

  • 受检查异常需要自行处理,运行时异常不需要
  • 受检查异常是Exception直接子类,运行时异常是RuntimeException的子类
  • 受检查异常多是编程时出现的错误,运行时异常是程序运行时故障率较高

避免出现NullPointerException的最佳实践[5]:

  • 用已知的字符串对象调用equals()和equalsIgnoreCase()方法【"hello".equals(objString)】;
  • 如果valueOf()和toString()方法的返回值一样的话,用valueOf()方法代替toString()方法【当为null的对象调用toString()方法时会抛出NullPointerException异常而调用valueOf()方法时会返回一个"null"的封装类】;
  • 使用对null安全的方法和库【eg, StringUtils.isBlank(), isNumeric(), isWhiteSpace()等】;
  • 方法调用的返回值用返回空的集合或者空的数组避免返回null的情况【Collections.EMPTY_LIST, Collections.EMPTY_SET和Collections.EMPTY_MAP等】;
  • 使用@NotNull和@Nullable的注解明确指出是否可能有null的情况出现;
  • 避免代码中出现不必要的自动装箱和拆箱【避免类似的int a 出现接收返回值为null的情况,用Integer a代替更好】;
  • 遵守契约并且使用合理的默认值【通过定义什么可以为空,什么不能为空,主叫方可以明确的作出判断。】;
  • 在使用数据库存储对象时,要定义是否允许某个字段为空,这样数据库自身机制可以检查是否为空的情况,避免程序调用后出现非法的空字段。
  • 使用null的封装对象Null类。

自定义一个Exception类:

ProjectNameException.java 内容如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

package com.trianlge23.projectname.exception;

 

public class ProjectNameException extends Throwable {

 

    private static final long serialVersionUID = 8093803025939797139L;

    //exception code

    private int exceptionCode;

    //exception detailed message

    private String detailMsg;

 

    public ProjectNameException(int exceptionCode, String extraMsg) {

        super();

        this.setDetailMsg(exceptionCode);

        this.setExtraMsg(extraMsg);

    }

 

    public ProjectNameException(int exceptionCode) {

        super();

        this.setDetailMsg(exceptionCode);

    }

 

    //notice: we do not offer the set method to set the excption code.

    public int getExceptionCode() {

        return exceptionCode;

    }

 

    //if there has no extra message for this excption code, init it.

    private void setDetailMsg(int exceptionCode) {

        this.exceptionCode = exceptionCode;

        if (ProjectNameExceptionCode.EXCEPTION_CODE_MAP

                .containsKey(exceptionCode)) {

            this.detailMsg = ProjectNameExceptionCode.EXCEPTION_CODE_MAP

                    .get(exceptionCode);

        } else {

            this.detailMsg = ProjectNameExceptionCode.EXCEPTION_CODE_MAP

                    .get(ProjectNameExceptionCode.PROJECTNAME_EXCEPTION_CODE_NOT_FOUND);

        }

    }

 

    //if there has extra message for this exception code, add it.

    private void setExtraMsg(String extraMsg) {

        this.detailMsg += ProjectNameExceptionCode.EXTRA_EXCEPTION_MSG_SPLITER

                + extraMsg;

    }

 

    //override the super class method getMessage()

    @Override

    public String getMessage() {

        return this.detailMsg;

    }

}

 

ProjectNameExceptionCode.java内容如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package com.triangle23.projectname.exception;

 

import java.util.HashMap;

import java.util.Map;

 

public class ProjectNameExceptionCode {

    //the separator between default message and extra message of exception.

    public static final String EXTRA_EXCEPTION_MSG_SPLITER = ": ";

    //the map stores the exception code and exception message

    public static Map<Integer, String> EXCEPTION_CODE_MAP;

    public static final int PROJECTNAME_EXCEPTION_CODE_NOT_FOUND = 1;

 

    static {

        EXCEPTION_CODE_MAP = new HashMap<Integer, String>();

        EXCEPTION_CODE_MAP.put(PROJECTNAME_EXCEPTION_CODE_NOT_FOUND,

                "[PROJECTNAME Exception] Not found exception code.");

 

    }

}

 

 

参考资料:

1. JDK1.7 API:http://docs.oracle.com/javase/7/docs/api/

2. Java编程思想(第四版)

3. Effective Java

4. Exception Handling Java Best Practices: 
http://javarevisited.blogspot.com/2013/03/0-exception-handling-best-practices-in-Java-Programming.html

5. Java Tips and Best practices to avoid NullPointerException: 
http://javarevisited.blogspot.com/2013/05/java-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html

时间: 2024-10-31 20:55:24

Java自定义Exception的相关文章

java 自定义表格 面板

问题描述 java 自定义表格 面板 如何用java实现一个自定义表格的编写,并将这个表格添加到面板上 解决方案 手把手教你做一个自定义表格标签 博客分类: J2EE 表格自定义标签grid分页table 如果你用公司的平台进行开发的话,许多时候向按钮,输入框,树,菜单等都是直接用一个标签设置几个属性就可以了.全局上样式是统一的,而且容易维护. 之前我已经发使用自定义标签来做数据字典的示例,也就是说自定义标签并不是你想的那么难,今天就再来作一个自定标标签实现的表格控件.当然你别较真,麻雀虽小五脏

java自定义拦截器用法实例_java

本文实例讲述了java自定义拦截器及其用法.分享给大家供大家参考.具体如下: LoginInterceptor.java文件如下: package com.tq365.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwo

java自定义线程模型处理方法分享_java

看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoarpg游戏划分,线程被划分为,主线程,全局同步线程,聊天线程,组队线程,地图线程,以及地图消息分发派送线程等: 一些列,都需要根据我的划分,以及数据流向做控制. 游戏服务器,主要要做的事情,肯定是接受玩家的 命令请求 -> 相应的操作 -> 返回结果: 在服务器端所有的消息都会注册到消息管理器里,然

Ensemble.Tofino运行报错Unexpected java bridge exception的解决

作为Visual Studio插件的Flex开发工具,Ensemble公司的Tofino确实很吸引人,包含编译环境的安装文件总共才122M,比起Flex Builder要不少.而且,对于熟悉了VS开发环境的.Net程序员,用这样的插件来做Flex开发方便了很多. 从官网下载安装文件,选择122M的包含开发编译环境的安装包下载.关闭Visual Studio,安装成功后开启Visual Studio,正常情况下Flex项目会出现在新建项目的页面上.新建一个Flex工程,如果你机器的java环境配置

Enterprise Library深入解析与灵活应用(4):创建一个自定义Exception Handl

Enterprise Library深入解析与灵活应用(4):创建一个自定义Exception Handler改变ELAB的异常处理机制 1.背景与动机 微软Enterprise Library ELAB(Exception Handling Application Block)提供了一种基于策略(Policy)的异常 处理方式,在不同的环境中,比如多层架构中不同的层次中,我们可以定义不同的异常处理策略.对于ELAB来说,Exception Handling Policy = Exception

Java自定义简单标签实例

Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用   下面将以权限的控制为例自定义一个标签:一.标签类型 复制代码 代码如下: <wxt:per uri="${pageContext.request.contextPath }/privilege/list"></wxt:per> 步骤:1.自定义一个类PerssionTag 继承SimpleTagSupport(自定义标签一般都会继承这

java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE 的理解

[2013-12-06 11:06:21,715] [C3P0PooledConnectionPoolManager[identityToken->2tl0n98y1iwg7cbdzzq7a|719f1f]-HelperThread-#2] DEBUG - com.mchange.v2.c3p0.impl.NewPooledConnection@484c6b closed by a client. java.lang.Exception: DEBUG -- CLOSE BY CLIENT STA

导入包 包自定义-JAVA 自定义类导入报错的问题。。。。

问题描述 JAVA 自定义类导入报错的问题.... 在学JAVA 用TXT文档编译运行的.先上环境设置,JAVA_HOME: C:Program FilesJavajdk1.8.0_60 CLASSPATH:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar; PATH:%JAVA_HOME%in; 我在E盘创建了一个文件夹,取名为com,又创建了1个子文件夹:sly. 一个Person类: package com.sly; public class P

java-小白问题:JAVA自定义容器类时,一段构造方法不太看得懂,求详细解释

问题描述 小白问题:JAVA自定义容器类时,一段构造方法不太看得懂,求详细解释 我先解释一下题意,现在要设计一个容器类(intArray2),这个容器的本质就是一段数组(暂且只装int值),这个数组可以的索引可以根据使用者传入的数据多少而自动增长,而自动产生新数组覆盖以前的,那么我的疑问就是如下这个....为什么构造方法要像第二图里那么写,而不能照我想的第一张图里的写 我觉的应该如此写(编译通过,运行报错,失败): 正确的写法,为什么要这么写两个: 测试代码,实参传或不传,传什么值,都不影响结果