Java基础(8)-异常体系以及项目中的运用

Java中的异常体系详解:深度解析与代码示例 在Java中,异常是指程序运行过程中发生的各种错误或意外情况,通常是由Throwable类及其子类表示。检查型异常(Checked Exception)非检查型异常(Unchecked Exception)异常类继承自Throwable类,ThrowableError和Exception,它们各自有不同的用途和分类。在一些特殊情况下,Java程序员可能需要定义自己的异常类。通过继承Exception类(或其子类),可以实现自定义异常。// 自定义异常。 阅读详情

今天复习了一天和Java异常体系相关的知识,在这篇文章总进行一个小小的总结,最后再提一提如何在项目中运用异常处理.

1.1 什么是异常(Exception),什么是错误(Error)

长话连篇的概念就不介绍了,简单地讲,异常和错误都属于Java异常体系中的一员,而异常是错误的孪生兄弟;错误一般由Java虚拟机所发现并且抛出,并不是由于开发者的代码逻辑问题而造成, 而异常则一般是由与程序自身出现的错误和遗漏所产生,而造成异常的原因有以下几点:

  • 1.用户输入了非法数据
  • 2.要打开的文件不存在
  • 3.网络通信时连接中断,或者JVM内存溢出

而异常的作用就是标明程序的错误并阻止程序继续往下进行,告知开发者程序无法正确地运行下去,这样才不会带来一系列由于异常的出现而导致的问题

1.2 异常体系一览

在Java中,所有的Exception类及其子类,Error类及其子类都继承自Throwable类, 这是Java异常体系的超类:

在这里插入图片描述

对于异常来说,可以大致分为两种异常:

  • 1.检查型异常
    检查型异常指的是Exception及其之下除了RuntimeException之外的子类,抛出后必须要处理的异常,如果不在当前程序段进行处理,则需要向上声明抛出
  • 2.非检查型异常指的是RuntimeException及其子类,它在抛出后无需强制处理

1.3 抛出异常

想要抛出一个异常很简单,只需要使用throw关键字就可以抛出一个异常:

	if (args == null) {
  	 	 throw new NullPointerException("args参数为null");
	}

1.4 捕获和处理异常

在异常声明之后需要进行异常的捕获和处理,我们可以使用try{}来捕获到异常,在之后使用catch(XException e){}来处理异常,例如下面的程序:

	public static void main(String[] args) {
        try {
            fun(null);
        } catch (NullPointerException e) {
            e.printStackTrace();
            //对异常进行处理
        }
    }

    public static void fun(String args) {
        if (args == null) {
            throw new NullPointerException("args参数为null");
        }
    }

当我们在程序中抛出的不是RuntimeException或者及其子类, 如果不立即捕获并且处理的话, 需要在方法中声明异常,向上抛出给调用者进行处理(注意处理者需要能够捕获到该类型的异常):

public static void main(String[] args) {
        try {
            fun(null);
        } catch (Exception e) {
            e.printStackTrace();
            //对异常进行处理
        }
    }

    public static void fun(String args) throws Exception{
        if (args == null) {
            throw new Exception("args参数为null");
        }
    }

在catch(XxException e){}块中对异常进行处理时可以按异常的类型进行相应的处理:

public static void main(String[] args) {
        try {
            fun(null);
        } catch (Xx1Exception e) {
            e.printStackTrace();
            //对异常类型1进行处理
        } catch (Xx2Exception e) {
            e.printStackTrace();
            //对异常类型2进行处理
        } catch (Xx3Exception e) {
            e.printStackTrace();
            //对异常类型4进行处理
        }
    }
这段程序会捕获fun方法产生的异常,并且按照异常的类型向下依次匹配,若抛出的异常是catch中的异常及其子类,则将会被相应的catch进行处理并且不会再往下匹配

当上面的catch块捕获的范围很大,而导致下面的catch块永远无法进去时,编译器报错:
在这里插入图片描述

1.5 finally块

finally块位于catch块之后,无论是否产生异常,finally块中的代码都会执行,并且能够无视try块和catch块中的程序结束关键字,例如break,continue或return:

public static void main(String[] args) {
        try {
            fun(null);
            return;
        } catch (Exception e) {
            e.printStackTrace();
            return;
            //处理
        } finally {
            System.out.println("Finally块执行");
        }
    }

    public static void fun(String args) throws Exception{
        if (args == null) {
            throw new Exception("args参数为null");
        }
    }
    
    //打印:
    java.lang.Exception: args参数为null
	at thinking_in_java.exception.ExceptionCatchTest.fun(ExceptionCatchTest.java:24)
	at thinking_in_java.exception.ExceptionCatchTest.main(ExceptionCatchTest.java:12)
Finally块执行

finally块一般用于以下几个方面:

  • 1.释放数据库连接
  • 2.关闭文件系统
  • 3.关闭其他第三方库的源,避免持续地使用内存

1.6 异常链

在一个异常中抛出另一个异常被称为异常链,而在JDK 4之前,异常链需要自己去维护,不然只会把异常栈堆打印到最新的异常,而不会去显示之前异常的栈堆日志;在JDK 4中,超类Throwable在构造方法中引入了cause,即它自身,这样的话在一个异常中抛出另一个异常就无需自己去处理了,直接把当前异常传入到新异常中即可:

public static void main(String[] args) {
        try {
            fun2(null);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("处理异常");
        }
    }

    public static void fun2(String[] args) throws Exception {
        try {
            fun1(null);
        } catch (Exception e) {
            //再次抛出异常
            throw new Exception(e);
        }
    }

    public static void fun1(String args){
        if (args == null) {
            throw new NullPointerException("args参数为null");
        }
    }

打印异常链:NullPointerException -> Exception
在这里插入图片描述

1.7 项目中如何进行异常处理

下面结合一个模板消息模块简单地讲讲如何运用异常处理,这是SpringBoot/SSM的一个项目,处理的思路是在service层进行异常的抛出,并且统一在controller层去进行异常捕获和处理:

  • ArgsLoseException
/**
 * @Auther: ARong
 * @Description: 参数缺失异常
 **/
public class ArgsLoseException extends Exception {
    public ArgsLoseException(){}
    public ArgsLoseException(String message){super(message);}
}
  • ArgsErrorException
/**
 * @Auther: ARong
 * @Description: 参数错误异常
 **/
public class ArgsErrorException extends Exception {
    public ArgsErrorException() {}
    public ArgsErrorException(String messasge) {super(messasge);}
}
  • TemplateMessageSerivceImp
/**
 * @Auther: ARong
 * @Description: 发送模板消息
 **/
@Service
@Transactional
@Slf4j
public class TemplateMessageSerivceImp implements TemplateMessageSerivce {
    @Autowired
    private MessageUtil messageUtil;
/**
     * @param messageEntity
     * @param opeType
     * @auther: Arong
     * @description: 注册成功后发送
     * @param: [messageEntity]
     * @return: AjaxResult
     */
    @Override
    public AjaxResult sendMessage(MessageEntity messageEntity, String opeType) throws ArgsLoseException, ArgsErrorException { 
        Map map = MessageUtil.MessageMap(
                messageEntity.getOpenId(),
                messageEntity.getPage(),
                messageEntity.getFormId()
        );

        if (opeType == null || "".equals(opeType.trim())) {
            throw new ArgsLoseException("opeType参数缺失");
        }

        if (!"YES".equals(opeType)) {
            throw new ArgsErrorException("opeType参数错误");
        }

        //...业务逻辑
        return null;
    }
  }

此时重点在于,controller层应该如何去处理这些异常呢?

首先我们需要注意的是,不应该让异常直接暴露在用户眼中,而是要将异常转化为前端的一种状态码,让前端去做相应的处理,例如根据状态码去提示用户哪些操作是错误的,或者说是网络延迟等等,总之重点在于前后端约定状态码以及将异常转化为用户眼中的一种状态:

  • TemplateMessageController
@Controller
@CrossOrigin
@RequestMapping(value = "/message")
@ResponseBody
@Slf4j
public class TemplateMessageController {
    @Autowired
    private TemplateMessageSerivce templateMessageSerivce;

    /**
     * @auther: Arong
     * @description: 注册成功后发送
     * @param: [messageEntity]
     * @return: AjaxResult
     */
    @PostMapping(value = "/sendMessage")
    public AjaxResult sendMessage(
            @ModelAttribute MessageEntity messageEntity,
            @RequestParam(name = "opeType") String opeType //操作类型
    ) {
        AjaxResult ajaxResult = null;
        try {
            ajaxResult = templateMessageSerivce.sendMessage(messageEntity, opeType);
        } catch (Exception e) {
            //打印异常栈堆路径
            e.printStackTrace();
            //分不同异常给前端返回不同的状态码(不要将异常暴露给前端,而是通过状态码让前端去反应)
            if (e instanceof ArgsLoseException) {
            	//回传状态码501
                return new AjaxResult(501, "传入opeType为空");
            } else if (e instanceof ArgsErrorException) {
            	//回传状态码502s
                return new AjaxResult(502, "参数错误");
            }
        }
        return ajaxResult;
    }
}

或者也可以这么去捕获异常,但是catch块会有很多:

try {
            ajaxResult = templateMessageSerivce.sendMessage(messageEntity, opeType);
        } catch (ArgsLoseException e) {
            //..
        } catch (ArgsErrorException e) {
            //..
        }

这样就可以让开发者知道哪出错了,而对于前端来说,只是转变了个状态码,跳转了其他页面

今天的异常体系就复习到这里吧,其实本来还想接着写一些源码分析,后来顺着执行过程看了下发现不过是不断地在构造函数中调用父类构造方法,直到调用到超类的构造方法中执行了一些方法,感觉没什么可以分析的了,今天就这样吧~(゜-゜)つロ (干杯)

java异常体系结构 超全的java异常体系结构以及异常的处理方案,Throwable->Exception-> RuntimeException 立即下载

相关推荐

从零搭建A股量化交易系统:开源框架选型与实战部署指南

本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。

sugar的博客 1277

java fx 报错 java.lang.instrument ASSERTION FAILED ***: “!errorOutstanding“ with message transform

在javafx中遇到的错误在fxml中通过了fxcontroller绑定了控制器在控制的controller里面使用了FXMLLoader.load获取这个fxml文件出现报错。

xc979906570的博客 1万+

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2155

java.lang.instrument ASSERTION FAILED ***: “!errorOutstanding“ with message transform method call fa

3、修改配置,取消勾选。

XinShun的博客 3505

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1494

黑客渗透测试后门隐藏技术揭秘

本文介绍了在授权渗透测试中隐藏后门文件(muma.exe)的多种技术手段。主要包括:通过WinRAR自解压脚本将后门与正常程序捆绑实现双开;利用系统自动运行目录和注册表实现开机自启;修改文件图标伪装成常用软件;将文件存放在冷门系统目录;设置系统+隐藏双重属性增强隐蔽性。此外还涉及对抗安全软件的加壳(UPX)、免杀(msfvenom编码)技术,以及进程注入、日志清除等运行隐藏方法。所有技术仅限合法授权测试使用,未经授权使用将面临法律责任。

m0_60781580的博客 1041

学习Spring AOP时报错:java.lang.instrument ASSERTION FAILED

····在学习《深入浅出spring-boot》第四章第一节时,敲完书中的代码没有得到想要的约定流程结果,并且报了个错。 完整错误: java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844 测...

weixin_42172228的博客 2万+

手把手教你用稚晖君Dummy机械臂实现位置控制:代码解析与调试技巧

本文深入解析了稚晖君Dummy机械臂实现高精度位置控制的代码核心与调试技巧。从CAN总线通信协议、三种位置控制模式(基础、带时间约束、带速度限制)的解析入手,详细阐述了命令帧结构、状态同步机制及单位换算。文章还提供了从通信测试、PID参数整定到异常处理、性能优化的完整实战调试流程,并探讨了多轴协调、自适应控制等进阶话题,旨在帮助开发者快速掌握该机械臂的精准运动控制。

weixin_29164091的博客 416

java的异常体系

1.运行时异常(逻辑方面)都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。2.其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)

qq_52988841的博客 294

告别WSL!实测AMD ROCm7预览版在Windows下跑ComfyUI,速度提升与避坑全记录

本文详细记录了在Windows原生环境下部署AMD ROCm7+PyTorch+ComfyUI的全流程,相比WSL环境性能显著提升。涵盖硬件兼容性确认、开发环境配置、Python环境搭建、ComfyUI部署优化及性能对比测试,为AI绘图爱好者提供实用指南。

weixin_42528090的博客 672

CODESYS连接触摸屏

触摸屏:威纶通-MT8071iP(网络IP:192.168.1.10) 控制器:研华AMAX-5580(PAC)(Win10系统,网络IP:192.168.1.3) CODESYS RTE:RTE 64 V3.5 SP13 Build05 笔记本:Thinkpad L14(网络IP:192.168.1.2) CODESYS IDE:V3.5 SP13(ADD ON V3.5.13.5) 一、确认网络通讯正常(关闭防火墙) 笔记本与触摸屏网络测试情况 笔记本与控制器网络测试情况 二、控制器部分 1、新建

Leo的博客 1万+

JAVA——》模拟虚拟机栈溢出

JAVA——》模拟虚拟机栈溢出

小仙~ 2447

【打卡帖】7日玩转ESP32——(第4日) 串口的输入输出

【福利帖】7日玩转ESP32——(第4日) 串口的输入输出

1377

java异常体系-创建自己项目异常体系[精]

java异常体系-创建自己项目异常体系 1.创建项目异常体系简述 在代码运行中我们会通过异常类来捕获异常信息帮助我们定位问题,查找问题的出现原因。但是java提供的异常类就像是一个模板,不能抛出项目自定义的异常信息出现。因此我们可以根据项目的需求创建一套符合自身项目的异常体系,在运行出错时候抛出我们需要定制化的异常信息。 2. 创建项目异常体系实例 2.1.创建自定义异常类步骤 创建一个包用...

Bruce小鬼 1332

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java中的异常体系是怎样的

下面我们从整体结构、分类、常见异常和错误等方面详细分析 Java 的异常体系。Java 中的异常体系是一个层次化的结构,所有异常和错误都继承自。通常表示外部因素导致的异常,如文件不存在、网络中断等。表示严重的系统错误,通常与程序逻辑无关,程序无法处理。必须在代码中显式处理(捕获或抛出),否则编译不通过。不需要在代码中显式处理,编译时不会检查。表示程序无法处理的严重错误。JVM 无法找到类的定义时抛出。:表示程序无法处理的严重错误。:表示程序可以处理的异常。尝试加载不存在的类时抛出。

完全体 753

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java基础:异常体系

异常体系图如下:Throwable类是所有异常*(Exception)和错误(Error)的超类,两个直接子类为Error和Exception。所有的异常的顶级父类都是Exception,Exception又分为运行时异常(非受检异常)和非运行时异常(受检异常)。

2301_78125917的博客 1454

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 中的异常体系

异常

weixin_46508088的博客 660

java异常体系

1、Error错误:(这种错误无法处理)描述了Java运行时系统的内部错误和资源耗尽错误。一般是指虚拟机(JVM)相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理。因为如果出现这样的内部错误,除了通告用户,并尽力使程序安全地终止之外,再也无能为力了。 2、Exception异常:Java的异常分为两种,checked Exception(编译时异常也叫非运行时异常)和 RuntimeException(运行时异常)。

m0_61983575的博客 1万+

Java 异常体系

在 Java 中,异常(Exception)是指程序运行过程中出现的异常情况或错误,它们会中断程序的正常执行流程。为了确保程序的健壮性,Java 提供了一个完整的异常处理机制。Java 的异常体系是以ThrowableError(错误)表示程序中严重的错误,通常是系统级别的问题,比如内存不足、虚拟机崩溃等。这些错误通常是不可恢复的,程序不应该也无法通过代码处理它们。Exception(异常)表示程序中可以被捕获和处理的异常情况。包括运行时异常和受检异常(Checked Exception)。

SAFE20242034的博客 991

Java—异常体系

Java的异常体系是Java语言中用于处理程序运行过程中可能出现的错误的机制。通过异常处理,程序可以在遇到问题时自动反馈,从而避免程序崩溃。Java异常体系中包含两大类:错误(Error)和异常(Exception)。

m0_74154813的博客 1154

Java的异常体系中的Error

Error通常表示严重的系统级问题,应用程序无法处理或恢复。与之相比,Exception是应用程序可以捕获并处理的异常。在编写代码时,通常不需要捕获Error,而是应该关注如何避免这些错误的发生(如优化内存使用、避免无限递归等)。

不如打代码 1083

JAVA中的异常体系

java中的异常体系分类及处理

XCatherine的博客 339

java基础之异常体系

java基础之异常体系 java异常体系介绍 异常是指由于各种不期而至的情况,导致程序中断运行的一种指令流,如:文件找不到、非法参数、网络超时等。为了保证正序正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理。异常也是一种对象,java当中定义了许多异常类,并且定义了基类java.lang.Th...

nongfuyumin的专栏 451

Java基础:Java异常体系

一、异常体系简介 异常是指由于各种情况,导致程序中断运行的一种指令流,例如:文件找不到、非法参数等等。为了保证程序正常运行,在设计程序之初,我们就要考虑各种异常情况,并正确处理他。异常也是一种对象,java中定义Throwable作为所有异常的超类。Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。 Java异常体系结构图,如下 Throwable:包括两个重要的子类:Exception(异常)和Error(错误)。 1.

qq_50838572的博客 2670
上一篇: 计网学习笔记(3)-Http协议总结
下一篇: Java基础(9)-反射与动态代理
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值