【自学java】异常处理简介

2021-02-04  本文已影响0人  AlexLJS

第四章 异常处理

学习 java 、刷算法题时,很少有人会在乎异常处理, 要不 try catch 、 要不就 throw 。但在做项目时候, 异常处理混乱会导致程序可维护性降低。异常本身也是程序的一部分。

第一节 简介


4.1.1 分类

Throwable 接口又分为“异常”、“错误”。异常是程序可以自己处理的, 错误一般是程序无法处理。

2020-07-22_210628.png

一旦捕获了异常,该段程序进入异常处理流程,不会在执行。try 后的代码还是会继续执行的。

    public static void main(String[] args) {
        try {
            System.out.println(13/0);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("会往下执行码?");
    }
out
会往下执行码?
java.lang.ArithmeticException: / by zero
at com.awork.common.utils.Test.main(Test.java:6)

4.1.2 检测性异常

异常的另一种分类 : 受检异常 checked、 非受检异常 unchecked。

区别: 在编译的过程中, 非受检异常不会提示,只有当程序运行到异常位置触发异常, 程序寻找异常是否被处理。

非受检异常: RuntimeException 、 Error
受检异常: IOException 、 SQL …

注:
jvm 认为受检异常是可修复的,在编译时会提出, 不会通过编译。诸如 RuntimeException 之类的非受检异常,可以通过编译。 但 jvm 认为程序本身有问题,应该本身捕获异常并处理,再重新运行程序。


第二节 异常与错误

4.2.1 区别

异常是程序可以自己处理的, 错误一般是程序无法处理。 异常处理是程序的一部分,处理过后程序依然可以继续执行流程 。 错误可能需要重新分配 jvm 资源,(如爆栈) 程序已经无法通过 try catch 处理了 。


第三节 异常的处理方式

4.3.1 处理

  1. 常规 try ... catch ... finally ...
    public static void main(String[] args) {
        try {
            System.out.println(13/0);
        }catch (Exception e){
            e.printStackTrace();
        } finally {
            System.out.println("finally");
        }
        System.out.println("会往下执行码?");
    }
out :
finally
java.lang.ArithmeticException: / by zero
会往下执行码?

可见 , 即使抓到异常, finally 代码块还是会执行 , 并且先于后续代码。

  1. throws

声明在方法中 ,表示方法可能会抛出异常,上层调用者需要捕获异常。

  1. throw

手动抛出异常 : throw new MyException(params);

4.3.2 自定义异常

便于对一类异常进行自定义分类, 遵循 java 封装原则。 便于捕获异常迅速定位。(比如, 是某类 service 出错)

继承 Exception , 重写构造方法 , 例如:

public class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String str) {
        super(str);
    }
}

4.3.3 获取异常信息的常用方法

  1. 方法1
    e.printStackTrace();

  2. 方法2

            StackTraceElement[] stackTrace = e.getStackTrace();
            for (StackTraceElement stackTraceElement : stackTrace) {
                String className = stackTraceElement.getClassName();
                System.out.println(className);
            }
上一篇下一篇

猜你喜欢

热点阅读