JAVA的异常处理

JAVA的异常处理

  • 异常处理方法:
    • 1.异常基本语法:
    • 2.try -catch 异常处理方法
    • 3.使用异常共同的父类Exception来捕获异常,
    • 4.关于异常的错误输出
    • 5.finally代码块,
  • 6.关于异常的调用链
  • 7.JDK新增的自动关闭接口
  • 8.一组关键字
    • throws:
    • throw:
  • 异常体系:
    • Error:
    • Java的异常体系分为两大类
      • 非受查异常:
      • 受查异常:
    • 自定义异常

运行时抛出的程序错误,编译出错不属于此处异常
常见的有:, 空指针异常,数组越界异常。
异常出错,异常之后的语句都不执行。

异常处理方法:

1.异常基本语法:

try{ 
//存放所有可能出现异常的代码
} [ catch( 捕获相应的异常)[0N]]{
// 出现相应异常后处理方式
}[finally]{
// 不是强制要求写
// 无论是否发生异常,都会执行finally代码块,一般进行资源的释放
//关闭资源操作
}

2.try -catch 异常处理方法

int[] arr = {10,20,30};
try {
    arr = null;
    System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组下标异常!");
} catch (NullPointerException e) {
    System.out.println("空指针异常");
}
System.out.println("arr[1]");

3.使用异常共同的父类Exception来捕获异常,

使用场景:当程序出现多种异常,且有的异常编程时也不太清楚-不太推荐
(一般明确知道会产生那种异常,就捕获相应的异常即可,这样方便排查问题)

try{
}catch(Exception e){
}

4.关于异常的错误输出

    在java中,一切皆对象,异常也是对象,上边的空指针等,都是异常类

当产生错误时,JVM都会建立相应的异常对象传递给程序
利用e.printStackTrace();可以让程序打印出异常位置(这里是自己让程序打印出的,而不是系统报出)

5.finally代码块,

定义:无论是否产生异常,都执行
当try代码块中,某一行语句出现异常,那么该代码块中异常之后的语句将不执行,直接跳出,如果你想无论异常是否产生都想执行一个语句,则可以放到finally代码块中。
通过尝试运行可以发现,无论异常是否发生,finally代码块中的内容一定会执行。那么可以将资源关闭操作等重要操作,放在finally 最终代码块中善后处理

//File是Java中文件操作类
File file = new File("src/java19_1_21/test.txt");
//输入不是键盘输入,是将文件输入到Scanner类中
Scanner scanner = null;
try {
    scanner = new Scanner(file);
    System.out.println("文件正确加载完毕");
} catch (FileNotFoundException e) {
    System.out.println("文件不存在!");
    e.printStackTrace();
} finally {
    //最后处理的一些代码
    System.out.println("文件正常处理完毕”);
}
    能走到finally说明在try-catch中的逻辑已经处理完毕,只剩finally的最后处理操作。
    一旦finally中有返回值,try-catchzh返回值就失效了,一般在finally中不推荐写返回值,除非返回值和异常无关,默认返回值可放在finally中。

6.关于异常的调用链

    异常会随着调用链不断向上传递,直到有一处捕获异常并处理为止,若调用过程都没有处理异常,最终会将异常抛到JVM,程序就终止了

7.JDK新增的自动关闭接口

    一旦一个类实现了AutoCloseable借口,就表示该类具备了自动关闭的能力-声明在try代码块中会自动调用close方法

在try(此处自动关闭调用){ }

8.一组关键字

throws:

(一般搭配自定义异常使用)用在方法声明上,明确表示该方法有可能会产生该异常,但是不处理此异常,抛回给调用者处理(谁调用谁处理)

public static void main(String[] args) {
    try{
        test();
    }catch(NullPointerException e) {
        System.out.println("捕获空指针异常!");
        e.printStackTrace();
    }
}
// 调用test方法有可能会产生空指针异常,但是test方法不处理此异常,谁调用谁处理
public static void test() throws NullPointerException,ArrayIndexOutOfBoundsException{
    String str = null;
    System.out.println(str.length());
}

throw:

    用在方法内部人为产生异常对象并抛出(之后数据结构的学习,自己在写栈等结构时,若栈为空,调用取出栈元素方法可以使用throw自定义异常)
public static void main(String[] args) {
        fun();
        System.out.println("fun之后的代码");
    }
    public static void fun(){
        throw new NullPointerException("抛个异常玩玩");
        //抛出异常后,方法就会结束
    }

异常体系:

Error:

    指的是程序的内部错误,这种错误程序猿无法捕获,一旦发生,程序只能告知用户出现错误,程序直接退出

StackOverflowError:栈溢出Error-一般中发生在递归调用链太深,递归没有出口
OutOfMemoryError:堆溢出Error
Exception:(java我们关注这个错误)

Java的异常体系分为两大类

非受查异常:

    不强制程序使用try-catch代码块
    Error以及RuntimeException(运行时异常,空指针,类型转换数组越界)及其子类都是

受查异常:

    必须显示使用try-catch处理
    除了上边的,必须显示处理,必须显示使用try-catch异常处理,或者throws抛出
    除了Error和RuntimeException以及其子类的其他异常都是受查异常,必须显示处理  

(受查就是不处理异常,编译不通过。而非受查不处理异常也可以编译通过)
自定义异常类:
程序开发中,一定会有一些错误是和具体的业务相关的,这种错误JDK是不可能提供相应的异常类,此时就需要继承已有异常类,产生自定义异常类
若需要用户强制进行异常处理,继承Exception父类-受查异常
若不需要显示处理异常,继承RuntimeException父类-非受查异常

自定义异常

程序开发中,一定会有一些错误是和具体的业务相关的,这种错误JDK是不可能提供相应的异常类,此时就需要继承已有异常类,产生自定义异常类
自定义异常类需要继承Exception父类-受查异常
下面展示得是若以框架的异常处理

package com.ruoyi.common.exception;

/**
 * 业务异常
 * 
 * @author ruoyi
 */
public final class ServiceException extends RuntimeException
{
    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    private Integer code;

    /**
     * 错误提示
     */
    private String message;

    /**
     * 错误明细,内部调试错误
     *
     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
     */
    private String detailMessage;

    /**
     * 空构造方法,避免反序列化问题
     */
    public ServiceException()
    {
    }

    public ServiceException(String message)
    {
        this.message = message;
    }

    public ServiceException(String message, Integer code)
    {
        this.message = message;
        this.code = code;
    }

    public String getDetailMessage()
    {
        return detailMessage;
    }

    @Override
    public String getMessage()
    {
        return message;
    }

    public Integer getCode()
    {
        return code;
    }

    public ServiceException setMessage(String message)
    {
        this.message = message;
        return this;
    }

    public ServiceException setDetailMessage(String detailMessage)
    {
        this.detailMessage = detailMessage;
        return this;
    }
}

在调用的时候使用

        throw new ServiceException("错误信息", 403);
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/353cab6fbcae4ff9a2900edf04f64583.png)

你可能感兴趣的:(java,python,开发语言)