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

来源:互联网 发布:如何做淘宝美工 编辑:程序博客网 时间:2024/05/23 00:57

异常

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

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

断言

  1. 断言,断言机制允许在测试期间向代码插入一些检查语句,当代吗发布时,这些插入的检查语句会被自动地移走。
  2. 两种形式:assert 条件;assert 条件:表达式;
    都会对条件进行检测,第一种情况,条件为false,抛出AssertionError异常,第二种,把表达式传给AssertionError的构造器。
  3. 默认情况下,断言禁用,可以开启包级别的断言;也可开启系统级别的断言。
  4. 工作中尚未见到使用很多断言,自测的时候可以辅助使用一些。

日志

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

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

此外常用的还有,log4j;logback等组件。

原创粉丝点击