异常分类:
编译时异常
编译时就能检查出来的异常,也被称为受检异常(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
避免空指针
断言(Assertion):一种调试程序的方法。。断言条件为true,继续执行,断言为false,抛出AssertionError
jvm默认关闭断言,要执行 assert 必须给虚拟机传递参数-enableassertions 或-ea…
public static void main(String[] args) {
assert false:"断言失败";
System.out.println("断言没有问题");
}
问题:
子类不可以继承父类的构造方法
子类不可以继承父类的构造方法,只可以调用父类的构造方法,子类中,所有的构造函数都会默认访问父类中的空参构造函数。。因为子类的构造函数内的第一行都有默认的super()语句,这个super()会去调用父类的空参构造。。。。
如果父类中没有无参构造,对应的子类构造也就会报错,super()不能引用无参构造,,必须在子类的构造函数中通过this或super 指定其他的构造函数



