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异常全部内容了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!