1 异常
(1)异常类的层次结构使用总结
(2)异常实践
- 常见RuntimeException有,错误类型转换,数组访问越界,访问null指针。
- 使用包装技术,不丢失原始异常细节。当需要把捕获的原始异常设置为新的异常时,使用包装技术不会丢失原始异常细节。 .initCause(e) 将原始异常进行包装;.getCause() 获取原始异常类型。(底层框架对原始异常捕获,进行包装抛出新的异常。你不能更改框架,当需要获取原始异常时,getCause() 就很有用)
/**
* 包装异常,获取原始异常示例
* @author gao tianci
* @version $Id: TestException.java, v 0.1 2017年7月18日 下午9:58:43 gao tianci Exp $
*/
public class TestException {
@Test
public void test() {
try {
throwIllegealOne();
} catch (IllegalArgumentException e) {
System.out.println("------(initCause())------");
System.out.println(e.getMessage());
System.out.println(e.getCause() instanceof SQLException);
}
try {
throwIllegealTwo();
} catch (IllegalArgumentException e) {
System.out.println("-----------(e)-----------");
System.out.println(e.getMessage());
System.out.println(e.getCause() instanceof SQLException);
}
try {
throwIllegealThree();
} catch (IllegalArgumentException e) {
System.out.println("---------(msg+e)---------");
System.out.println(e.getMessage());
System.out.println(e.getCause() instanceof SQLException);
}
}
//SQLException
public static void throwSQL() throws SQLException {
throw new SQLException("sql error.");
}
//initCause()
public static void throwIllegealOne() throws IllegalArgumentException {
try {
throwSQL();
} catch (SQLException e) {
IllegalArgumentException illegal = new IllegalArgumentException("参数非法");
illegal.initCause(e);
throw illegal;
}
}
//e
public static void throwIllegealTwo() throws IllegalArgumentException {
try {
throwSQL();
} catch (SQLException e) {
throw new IllegalArgumentException(e);
}
}
//msg + e
public static void throwIllegealThree() throws IllegalArgumentException {
try {
throwSQL();
} catch (SQLException e) {
throw new IllegalArgumentException("参数非法" + e);
}
}
}
测试结果:
------(initCause())------
参数非法
true
-----------(e)-----------
java.sql.SQLException: sql error.
true
---------(msg+e)---------
参数非法java.sql.SQLException: sql error.
false
-
分析堆栈轨迹
堆栈轨迹是一个方法调用过程的列表。可借助 Throwable 类的printStackTrace() 或 getStackTrace() 方法进行分析。静态的Thread.getAllStackTrace() 方法,它可以产生所有线程的堆栈轨迹。 -
多线程异常使用注意
一个方法的内部开启了多线程处理,多线程里出现了异常,你在方法出口处肯定捕捉不到!因为他们不是一个线程了!
2 断言
- 断言,断言机制允许在测试期间向代码插入一些检查语句,当代码发布时,这些插入的检查语句会被自动地移走。
- 两种形式:assert 条件;assert 条件:表达式;
都会对条件进行检测,第一种情况,条件为 false,抛出 AssertionError 异常,第二种,把表达式传给 AssertionError 的构造器。 - 默认情况下,断言禁用,可以开启包级别的断言;也可开启系统级别的断言。
- 工作中尚未见到使用很多断言,自测的时候可以辅助使用一些。