Java-根底-异样解决

reference:

  1. https://github.com/dunwu/java...

1. Throwable 类

Throwable 有两大子类:Exception和Error;对应个别异样和运行谬误(个别不捕捉运行谬误)。在 Java 中只有 Throwable 类型的实例才能够被抛出(throw)或者捕捉(catch),它是异样解决机制的根本组成类型。

1.1 Throwable

Throwable 蕴含了其线程创立时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。

次要办法:

  • fillInStackTrace - 用以后的调用栈档次填充 Throwable 对象栈档次,增加到栈档次任何先前信息中。
  • getMessage - 返回对于产生的异样的详细信息。这个音讯在 Throwable 类的构造函数中初始化了。
  • getCause - 返回一个 Throwable 对象代表异样起因。
  • getStackTrace - 返回一个蕴含堆栈档次的数组。下标为 0 的元素代表栈顶,最初一个元素代表办法调用堆栈的栈底。
  • printStackTrace - 打印 toString() 后果和栈档次到 System.err,即谬误输入流。
  • toString - 应用 getMessage 的后果返回代表 Throwable 对象的字符串。

1.2 Exception

1.3 Error

1.4 RuntimeException

RuntimeException 继承于 Exception ,与 Exception 不一样的是,编译器不会查看是否捕捉了 RuntimeException 及其子类。

2 抛出&异样捕捉

  • 抛出异样

    throw new Exception("抛出一个异样");
  • 异样捕捉

    try{do something}catch (Exception1 e){do something}catch (Exception2 e){do something}finally{do something}

代码样例

class BasicException extends Exception {    public BasicException() {        super("BasicException throw");    }    public BasicException(String msg) {        super(msg);    }}class ChildException extends BasicException {    @Override    public String getMessage() {        /**         *  除非要笼罩、改写父类信息才须要重写 getMessage 办法;         */        System.out.println(super.getMessage());        return "ChildException throw";    }}public class ArrayTest {    public static void main(String[] args) throws Exception {//        throw new BasicException();//        Exception in thread "main" BasicException: BasicException throw//                at ArrayTest.main(ArrayTest.java:29)//        throw new BasicException("basic");//        Exception in thread "main" BasicException: basic//        at ArrayTest.main(ArrayTest.java:33)        // 父子类异样同时呈现在异样中,优先依照程序捕捉子类        try {            throw new ChildException();        } catch (ChildException e2) {            // 留神必须是父类在后,不然编译报错            System.out.println("ChildException catch");        } catch (BasicException e) {            System.out.println("BasicException catch");        }        //ChildException catch    }}
  • 反射对异样捕捉的影响

反射中的异样继承 ReflectiveOperationException 类

反射中的异样,因为反射包裹了一层堆栈,因而要获取精确的异样信息应该利用getTargetException获取实在的异样信息。

  • 多线程与异样
如果子线程不捕捉异样,会导致该线程退出。

3 异样链(深层异样抛出,反射包裹)

4. 小倡议

  • 对可复原的状况应用查看性异样(Exception),对编程谬误应用运行时异样(RuntimeException)。
  • 优先应用 Java 规范的异样。
  • 抛出与形象绝对应的异样。
  • 在细节音讯中蕴含能捕捉失败的信息。
  • 尽可能减少 try 代码块的大小。
  • 尽量放大异样范畴。例如,如果明知尝试捕捉的是一个 ArithmeticException,就应该 catch ArithmeticException,而不是 catch 范畴较大的 RuntimeException,甚至是 Exception
  • 尽量不要在 finally 块抛出异样或者返回值。
  • 不要疏忽异样,一旦捕捉异样,就应该解决,而非抛弃。
  • 异样解决效率很低,所以不要用异样进行业务逻辑解决。
  • 各类异样必须要有独自的日志记录,将异样分级,分类管理,因为有的时候仅仅想给第三方运维看到逻辑异样,而不是更细节的信息。
  • 如何对异样进行分类:

    • 逻辑异样,这类异样用于形容业务无奈依照预期的状况解决上来,属于用户制作的意外。
    • 代码谬误,这类异样用于形容开发的代码谬误,例如 NPE,ILLARG,都属于程序员制作的 BUG。
    • 专有异样,多用于特定业务场景,用于形容指定作业出现意外状况无奈事后解决。