Java基础|异常、断言一文道尽

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 断言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值