Java异常

一、异常简介

什么是异常

 异常本质上是程序的错误,错误在我们编写程序的过程中经常发生,包括编译期间和运行期间的错误,

 编译期间错误编译器会给出提示、运行期间错误编译器不会提示,往往难以所料

异常的分类

 - Java中通过Throwable及其相关子类对异常进行描述

 - Error是程序无法处理的错误,表示运行应用程序中较严重的问题,这类错误是不可查的,不需要处理它所引起的异常

 - Exception是程序本身可以处理的异常。异常处理通常指的是对这种类型或其子类进行处理

 - Unchecked Exception(非检查异常)编译器不要求强制处置的异常,RuntimeException子类就是非检查异常

 - Checked Exception(检查异常)编译器要求必须处置的异常,除了RuntimeException的子类基本都是检查异常

二、异常处理简介

 异常处理机制为:先抛出异常,后捕获异常

 抛出异常:当一个方法中出现错误引发的异常时,方法会创建异常对象并交付给运行时系统进行处理,异常对象通常包含异常类型及异常出现时的程序状态等

 捕获异常:运行时系统捕获到异常后,会去寻找合适的处理器,如果找到与之匹配的处理器就会执行相关的处理逻辑,如果始终没找到,运行时系统将会终止,即Java程序终止运行

 Java规定:对于可查异常必须捕获,或者声明抛出;允许忽略不可查的RuntimeException和Error

 try-catch-finally用于捕获异常、throws声明可能要抛出的异常、throw手动抛出异常,例如:throw new Exception("我是一个异常");

三、异常处理

 使用try-catch-finally实现异常处理:

  try块负责抛出异常,catch块负责捕获异常,finally块无论如何都会执行

  try块后可跟一个或多个catch块,如果没有catch块,则必须跟一个finally块

  应用多重catch进行异常捕获时,需要注意范围,即大范围(父类)后置,建议在catch块最后加一个父类异常Exception用于捕获意料之外的异常

  e.printStackTrace();可以打印出错误的堆栈信息,包括错误的描述、错误的类型、错误出现的位置,但输出位置是随机的

  return不能打断finally块的执行,所以不建议在finally中写return语句

  System.exit(1);终止当前正在运行的Java虚拟机,且不会执行finally块中代码

 使用throw和throws实现异常处理:

  如果一个方法可能会出现异常,但却没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常,谁调用这个方法,谁就来处理它

   throws后可跟单个或多个异常类型,不可跟异常对象

  throw抛出异常两种处理方案:1.通过try-catch包含throw语句,自己抛出自己处理   2.通过throws向上抛出,谁调用谁处理

  异常的抛出也可以实现一些特定的业务逻辑处理方案

四、自定义异常

  可以通过自定义异常描述特定业务产生的异常类型

public class MyException extends Throwable{
    public MyException (){
        super("我是一个异常");
    }
}

public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        if(n!=1){
            try {
                throw new MyException();
            } catch (MyException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
}

五、异常链

 将异常产生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出

public class Test {
    public static void main(String[] args) throws IOException {
        try {
            testThree();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void testOne() throws MyException{
        throw new MyException();
    }

    public static void testTwo() throws Exception {
        try {
            testOne();
        } catch (MyException e) {
            throw new Exception("我是新产生的异常1",e);
        }
    }
    public static void testThree() throws Exception {
        try {
            testTwo();
        } catch (Exception e) {
//            throw new Exception("我是新产生的异常2",e);
            Exception exception=new Exception("我是新产生的异常2");
            exception.initCause(e);
            throw exception;
        }
    }
}
posted @ 2022-03-29 13:16  南风知君  阅读(36)  评论(0)    收藏  举报