Java 异常类型学习

异常类型

upload successful

Throwable 类是 Error 和 Exception 的父类,只有是 Throwable 的实例才能被 JVM 或者 Java 语句抛出,捕获。

  • Error:表示不希望被程序捕获或者是程序无法处理的错误,Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。

  • Checked Exception:受检查异常,需要被 try catch 捕获或者 throws 抛出;如果不处理,IDE 会提示编译不通过。

  • Runtime Exception(Unchecked Exception):运行时异常,由程序逻辑错误引起,程序应该尽可能的避免该类异常。

异常处理

异常发生时,有两种处理方式:捕获 or 抛出

捕获:try catch

抛出

  • 方法名上面声明抛出 throws。

  • 方法内抛出 throw

异常抛出限制

  • 父类的方法没有声明异常,子类在重写该方法的时候不能声明异常;
  • 子类重写父类抛出的异常方法时,可以抛出或者不抛出异常;若抛出异常,子类抛出的异常类型必须与父类方法抛出异常类型相同,或者子类抛出的异常类型是父类方法抛出异常的子类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    错误抛出情况:子类抛出的 IOException 和 RuntimeException 不是同类型,也不是其子类。

    public class C {
    public void fun() throws RuntimeException{
    }
    }

    public class D extends C {
    public void fun() throws IOException,RuntimeException{
    }
    }
  • 如果父类抛出了 CheckedException ,那么子类重写的方法可以抛出 RuntimeException

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    正确的抛出情况:
    public class A {
    public void fun() throws IOException {
    };
    }

    public class B extends A {
    public void fun() throws IOException,RuntimeException{
    }
    }

自定义异常

所有异常都必须是 Throwable 的子类。

如果希望写一个检查性异常类,则需要继承 Exception 类。

如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

异常捕获流程

1、try{} 里有一个 return 语句,那么紧跟在这个 try 后的 finally{} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后?

答案:会执行,在方法返回调用者前执行。