栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

异常java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

异常java

异常分类

异常分类:

编译时异常
编译时就能检查出来的异常,也被称为受检异常(Checked Exception)…如IOException,不能恢复,必须要使用者来处理的一类异常运行时异常
运行时才会被检查的异常,如RuntimeException

引用:https://zhuanlan.zhihu.com/p/261170676

必须要捕获的异常: 包括Exception及其子类,但不包括RuntimeException
不需要捕获的异常: 包括Error及其子类,RuntimeException及其子类

异常类型转换
如果捕获了一个异常,然后再抛出一个异常,需要将原始的Exception对象传递进去,不然会丢失原始异常信息
getCause() 获取原始异常,返回null,表示他就是根异常

public class Demo01 {

    public static void main(String[] args) {
        try {
            process1();
        } catch (Exception e) {
//            e.printStackTrace();
//            getCause() 获取原始异常   null表示已经是根异常
            System.out.println(e.getCause());
        }
//        process1();
    }

    static void process1(){
        
        try {
            process2();
        } catch (Exception e) {
            System.out.println(e.getCause());  // null  表示根异常
            throw new IllegalArgumentException(e); // 传入 e 会显示 caused by
        }
    }

    static void process2(){
        Integer.parseInt(null);
    }
}
异常屏蔽

try … catch … finally 中 ,,先进入catch块执行,然后进入finally 执行,然后再抛出 catch 块异常,如果finally中有异常,会屏蔽掉catch中的异常。。因为只能抛出一个异常,,没有被抛出的异常就称为“被屏蔽”的异常(Suppressed Exception)

解决方法: 使用getSuppressed()获取被压制的异常,使用addSuppressed()添加在finally中的异常中,最后在finally中抛出

 public static void main(String[] args) {
        Exception origin = null;
        try {
            Integer.parseInt("abc");
        } catch (NumberFormatException e) {
            System.out.println("catch");
            origin = e;
        }finally{
            System.out.println("finally");
            IllegalArgumentException e = new IllegalArgumentException();
            if(origin != null){
                e.addSuppressed(origin);
            }
            throw e;
        }
    }


通常不要在finally中抛出异常,如果有,需要添加所有的Suppressed Exception

避免空指针

assert

断言(Assertion):一种调试程序的方法。。断言条件为true,继续执行,断言为false,抛出AssertionError
jvm默认关闭断言,要执行 assert 必须给虚拟机传递参数-enableassertions 或-ea…

    public static void main(String[] args) {
        assert false:"断言失败";
        System.out.println("断言没有问题");
    }

问题:
子类不可以继承父类的构造方法
子类不可以继承父类的构造方法,只可以调用父类的构造方法,子类中,所有的构造函数都会默认访问父类中的空参构造函数。。因为子类的构造函数内的第一行都有默认的super()语句,这个super()会去调用父类的空参构造。。。。
如果父类中没有无参构造,对应的子类构造也就会报错,super()不能引用无参构造,,必须在子类的构造函数中通过this或super 指定其他的构造函数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号