您的位置:首页 > 编程语言 > Java开发

Java基础[7]异常,断言,日志

2017-07-31 23:15 555 查看

异常

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()方法,它可以产生所有线程的堆栈轨迹。

踩过的坑

一个方法的内部开启了多线程处理,多线程里出现了异常,你在方法出口处肯定捕捉不到!因为他们不是一个线程了!!!

断言

断言,断言机制允许在测试期间向代码插入一些检查语句,当代吗发布时,这些插入的检查语句会被自动地移走。

两种形式:assert 条件;assert 条件:表达式;

都会对条件进行检测,第一种情况,条件为false,抛出AssertionError异常,第二种,把表达式传给AssertionError的构造器。

默认情况下,断言禁用,可以开启包级别的断言;也可开启系统级别的断言。

工作中尚未见到使用很多断言,自测的时候可以辅助使用一些。

日志

java自带的日志包在 java.util.logging.*中。使用开源的日志组件会更友好,强烈推荐slf4j,代码简洁,格式化方便。

eg:

logger.info("Processing trade with id: {} and symbol : {} ", id, symbol);


此外常用的还有,log4j;logback等组件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: