java中的异常处理

     基本概念     

首先我们要知道,一个程序在运行过程中可能会遇到程序终止的情况,一般这种情况可以分成两大类

 

一类是可以处理,非致命性的,正确处理之后程序可以进行,就是我们说的 异常

 

另一类是不能进行简单的恢复执行,程序遇到了严重的不正常情况,是致命性的,称之为 错误 , 包括 虚拟机错误,动态连接失败等 

 

异常 按照性质,又分为  编译时异常 跟  运行时异常  

 

编译时异常,程序正确,外部条件不满足引发的异常,源代码(.java文件)编译成字节码(.class文件)编译不通过

 

运行时异常,程序错误,程序存在bug, 比如我们常见的 

 

数组角标越界异常 java.lang.ArrayIndexOutOfBoundsException(就是定义了一个只能存5个元素的数组,结果存了6个)  

 

还有就是空指针异常 java.lang.NullPointerException  等等 

 

 

异常处理

 

在java 中 ,处理异常主要有两种方式

 

  • 一种是交由java 预设处理机制,(简单来说就是往上抛 ) 用关键字throws

     

   这种方法有点贱了,就是我发现这边有异常,我不去处理,我标记一下,往上抛,等你调用我的时候,你再去处理这个异常

 

 

 

1
2
3
4
public  static int throwMyException() throws ArithmeticException {
 
      return 0;
  }

  

  • 另一种方法就是 将异常进行捕获,自己拉的屎自己处理干净 ,别人调用你时就不用再处理异常 

 

捕获异常使用 try和catch 关键字 ,try/catch 代码块放在异常可能出现的地方 

1
2
3
4
5
6
7
8
9
try{
            int[]  array = new int[2];
            System.out.println("获取角标为的元素 :" + array[3]);
        }catch (ArrayIndexOutOfBoundsException  e) {
            e.printStackTrace();
            System.out.println("Exception thrown  :" + e);
            System.out.println("数组角标越界了!!!");
        }
    }

  

打印结果: 

 

 

 

可以看出,当try 里面程序出现异常时,执行catch里面的代码,将异常进行捕获

 

捕获异常时,还有一个关键字finally ,指的是,不论程序是否发生异常,都会执行finally里面的代码块,例如:

1
2
3
4
5
6
7
8
9
10
try{
           int[]  array = new int[2];
           System.out.println("获取角标的元素 :" + array[3]);
       }catch (ArrayIndexOutOfBoundsException  e) {
           e.printStackTrace();
           System.out.println("Exception thrown  :" + e);
           System.out.println("数组角标越界了!!!");
       } finally {
           System.out.println("程序发生异常,我是一定会执行的方法");
       }

  

 

 

 再看未发生异常的情况  

1
2
3
4
5
6
7
8
9
10
try{
           int[]  array = new int[2];
           System.out.println("获取角标的元素 :" + array[1]);
       }catch (ArrayIndexOutOfBoundsException  e) {
           e.printStackTrace();
           System.out.println("Exception thrown  :" + e);
           System.out.println("数组角标越界了!!!");
       } finally {
           System.out.println("程序没有发生异常,我是一定会执行的方法");
       }

  
打印结果:

 

 

 因为数组里面没有数据,整形默认值为 0 

 

 

自定义异常 

先说说为什么要自定义异常 ?

 

自定义异常 能更加直观地返回错误数据给前端,便于统一进行处理,话不多说,直接来看实现过程,记得收藏,后续业务需求 ,工作中  100% 可以用到 

 

 

首先编写一个 封装API的错误码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 封装API的错误码
 * @author: xrp
 */
public interface IErrorCode {
    /**  getCode
     * @return  long
     */
    long getCode();
    /**  getMessage
     * @return  String
     */
    String getMessage();
}

  最后写一个全局异常处理器  GlobalExceptionHandler

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
 * @author xrp
 */
@ControllerAdvice
public class GlobalExceptionHandler {
 
    @ResponseBody
    @ExceptionHandler(value = ApiException.class)
    public ResponseMessage<Object> handle(ApiException e) {
        if (e.getErrorCode() != null) {
            return ResultUtils.failed(e.getErrorCode());
        }
        return ResultUtils.failed(e.getMessage());
    }
 
    @ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseMessage<Object> handleValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String message = null;
        if (bindingResult.hasErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null) {
                message = fieldError.getField()+fieldError.getDefaultMessage();
            }
        }
        return ResultUtils.validateFailed(message);
    }
 
    @ResponseBody
    @ExceptionHandler(value = BindException.class)
    public ResponseMessage<Object> handleValidException(BindException e) {
        BindingResult bindingResult = e.getBindingResult();
        String message = null;
        if (bindingResult.hasErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null) {
                message = fieldError.getField()+fieldError.getDefaultMessage();
            }
        }
        return ResultUtils.validateFailed(message);
    }
}

  

ResultUtils  为返回前端构造工具 ,一般公司会同一封装

 

使用断言  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.common.utils.securityutils;
 
/**
 *
 * @author xrp
 */
public class Asserts {
    public static void fail(String message) {
        throw new ApiException(message);
    }
 
    public static void fail(IErrorCode errorCode) {
        throw new ApiException(errorCode);
    }
}

  

接下来我们就可以使用了,例如

 

1
2
3
if(!xxxxx) {
    Asserts.fail("CRON表达式不正确"
}

  

以上便是本期 java异常全部内容了

 

 

posted @   从零开始。  阅读(246)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示