java基础总结07-异常

异常的定义

  • 异常就是有异于常态,和正常情况不一样,有错误出现。在java中,阻止当前方法或作用域的情况,称之为异常。

异常的分类

在这里插入图片描述

  • Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

  • Exception::程序本身可以捕获并且可以处理的异常。

运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

异常主要分为:错误、一般性异常(受控异常)、运行时异常(非受控异常)

异常的成员方法

如上图,介绍最顶层Throwable

方法名说明
public String getMessage()返回此 throwable 的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

使用方法请参考下文

异常的处理

运行时异常(系统异常)不需要预处理,通过规范的代码可以避免产生这种异常
受检异常(编译时异常)必须预处理,否则编译报错,有两种预处理方式 :

  • 捕获异常:try,catch,finally
  • 抛出异常throw throws

捕获异常try,catch,finally

  • 格式:
    private static void demo() {
        try {
            //1、对可能产生异常的代码进行检视
            //2、如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行, try代码块后面的代码不再执行
            //3、try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
        } catch (异常类型1 e1) {
            //捕获异常类型1的异常, 进行处理
            //在开发阶段, 一般的处理方式要么获得异常信息, 要么打印异常栈跟踪信息(e1.printStackTrace())
            //在部署后, 如果有异常, 一般把异常信息打印到日志文件中, 如:logger.error(e1.getMessage());
        } catch (异常类型2 e1) {
            //捕获异常类型2的异常, 进行处理
            //如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常
            //如果没有继承关系, catch子句没有先后顺序
        } finally {
            //不管是否产生了异常, finally子句总是会执行
            //一般情况下, 会在finally子句中释放系统资源
        }
    }

  • 实例:
class Demo2 {
    public static void main(String[] args) {
        double a;
        int b=0;
        try {
            System.out.println("我在尝试执行我前面的路,如果我错了,我就不从这里走了");
            b ++;
            a = 1 / 0;
            System.out.println("看看我以前走过的路怎么样");
        } catch (Exception e) {
            System.out.println("这才是失败者应该走的路");
            System.out.println(e.getMessage());
        }finally {
            System.out.println("无论我走那条路,我都会从这条路走过");
        }
        System.out.println(b);
    }
}

打印数据

我在尝试执行我前面的路,如果我错了,我就不从这里走了
这才是失败者应该走的路
/ by zero
无论我走那条路,我都会从这条路走过
1

这里我其实也想错了,原来以为try的语句如果报错,呢么try语句整个句子都会跳过,事实证明,我错了,try中的语句,一直到报错之前,语句都正常执行

抛出异常throw throws

class Demo3 {
    public static void main(String[] args) {

        //throwDemo();
        //System.out.println("============");

        // 受检异常,必须捕获,否则直接终止运行
        try {
            throwsDemo();
        } catch (ParseException e) {
            System.out.println(e.toString()); // java.text.ParseException: Unparseable date: "2020-07"
        }


    }

    private static void throwsDemo() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm");
        sdf.parse("2020-07");
    }

    private static void throwDemo() {
        throw new ArithmeticException("算数异常");
    }
}

自定义异常


//1,定义异常类
// 2,继承RuntimeException或其他异常类
class MyException extends RuntimeException{
    // 3,空参构造
    public MyException(){}
    // 4,有参构造
    public MyException(String message){
        //super(message);
        System.out.println(message + "=======");
    }

}

class Demo4{
    public static void main(String[] args) {
        //throw new RuntimeException();
        throw new MyException("www");
    }
}

posted @ 2022-04-02 09:46  coderwcb  阅读(37)  评论(0)    收藏  举报