Java自定义Exception

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

国内私募机构九鼎控股打造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

目录
相关文章
|
29天前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
44 3
|
3月前
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
|
12天前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
32 2
|
23天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
57 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
29天前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
45 1
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
41 3
|
2月前
|
IDE Java 开发工具
java自定义异常20
java自定义异常20
27 3
|
2月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
18 0