博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java自定义Exception
阅读量:6859 次
发布时间:2019-06-26

本文共 4073 字,大约阅读时间需要 13 分钟。

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:

内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

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

 

原文地址:

这里总结一下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:

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

3. Effective Java

4. Exception Handling Java Best Practices: 

5. Java Tips and Best practices to avoid NullPointerException: 

转载地址:http://hptyl.baihongyu.com/

你可能感兴趣的文章
2014年java软件project师面试题收集
查看>>
Java并发编程:Callable、Future和FutureTask
查看>>
这些老外的开源技术养活了很多国产软件
查看>>
svn简单介绍
查看>>
hbase region still in transition
查看>>
CSS Flex布局属性整理
查看>>
【struts2】中method={1}具体解释
查看>>
Android Studio 函数使用方法提示 快捷键
查看>>
构建自己的PHP框架--构建模版引擎(2)
查看>>
vue28-2.0-过滤器
查看>>
Cocos2d-x 多点触摸
查看>>
MySql按周/月/日分组统计数据的方法
查看>>
自定义控件_VIewPager显示多个Item
查看>>
2015年年尾总结
查看>>
UI组件之AdapterView及其子类(五)ListView组件和ListActivity
查看>>
Linux编程之select
查看>>
数据库表设计--备份记录的表设计优化
查看>>
小谈业务应用架构
查看>>
JWPlayer Uncaught Error: Invalid SRT file
查看>>
mysql使用GROUP BY分组实现取前N条记录的方法
查看>>