Java高级应用——异常处理

文章目录

    • 异常处理
      • 概念
      • Java异常体系
      • Error 和 Exception
      • 编译时异常和运行时异常
      • Java异常处理的方式

异常处理

概念

异常处理是在程序执行过程中遇到错误或异常情况时的一种机制,它允许程序在错误发生时进行适当的处理,而不会导致程序崩溃或产生不可预测的结果。

  1. 异常类型:
    • 受检异常(Checked Exception):这些异常在编译时强制要求进行处理,例如IOException、SQLException等。程序必须使用try-catch块或throws语句显式处理这些异常。
    • 非受检异常(Unchecked Exception):也称为运行时异常(Runtime Exception),这些异常在编译时不强制要求进行处理,例如NullPointerException、ArrayIndexOutOfBoundsException等。程序可以选择处理或不处理这些异常。
  2. 异常处理机制:
    • try-catch语句块:使用try块包含可能引发异常的代码,并使用catch块捕获并处理特定类型的异常。如果try块中的异常与catch块中指定的异常类型匹配,那么相应的catch块将被执行。
    • finally块:无论是否发生异常,finally块中的代码始终会被执行。通常用于资源的释放,如关闭文件、数据库连接等。
    • throws关键字:在方法声明中使用throws关键字可以将异常抛出给调用者处理。如果一个方法可能抛出受检异常,但方法本身不处理该异常,可以使用throws关键字将其传递给上层调用者处理。
  3. 异常处理流程:
    • 当在try块中发生异常时,程序将立即跳转到与异常类型匹配的catch块。
    • 如果找不到匹配的catch块,异常将传递给调用者的上层方法,直至找到合适的catch块或达到程序的顶层(如main方法)。
    • 如果异常没有被处理,程序将终止并打印异常信息。
  4. 嵌套的try-catch块:
    • 可以在一个try块中嵌套另一个try-catch块,用于处理更细粒度的异常情况。
    • 内层的catch块先捕获并处理异常,如果没有匹配的catch块,则将异常传递给外层的catch块继续处理。
  5. 自定义异常:
    • 可以通过扩展Exception类或其子类来创建自定义异常类。
    • 自定义异常类可以添加额外的属性和方法,以满足特定的异常需求。
  6. 异常处理最佳实践:
    • 针对不同类型的异常进行具体的处理,避免使用过于宽泛的异常捕获。
    • 在catch块中记录异常信息,以便进行错误分析和调试。
    • 在finally块中释放资源,确保资源得到正确的处理。
    • 适当地使用throws关键字将异常传递给调用者,避免过度捕获异常。

Java异常体系

Java异常体系是Java编程语言中用于处理错误和异常情况的层次结构。它是基于类的,并且所有的异常类都是从java.lang.Throwable类派生的。

  1. java.lang.Throwable

    • Throwable是Java异常体系的根类,它是所有异常类的基类。
    • Throwable有两个子类:ErrorException

    Error 和 Exception

  2. java.lang.Error

    • Error表示严重的系统级错误,通常由虚拟机引发。
    • Error及其子类一般不被程序员捕获和处理,因为这些错误通常表示无法恢复的情况,如OutOfMemoryErrorStackOverflowError等。
  3. java.lang.Exception

    • Exception是所有非严重错误和异常的基类。
    • Exception分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

    编译时异常和运行时异常

  4. 受检异常(Checked Exception):

    • 受检异常是在编译时强制要求进行处理的异常,以便程序能够在异常发生时进行适当的处理。
    • 受检异常是Exception类的子类,但不是RuntimeException的子类。
    • 例如:IOExceptionSQLException等。
  5. 非受检异常(Unchecked Exception):

    • 非受检异常是在编译时不强制要求进行处理的异常,通常是由程序逻辑错误或运行时错误引发的。
    • 非受检异常是RuntimeException类及其子类的实例。
    • 例如:NullPointerExceptionArrayIndexOutOfBoundsException等。

    在这里插入图片描述


    Java异常处理的方式

  6. 异常处理的关键字:

    • try:用于包含可能引发异常的代码块。
    • catch:用于捕获并处理特定类型的异常。
    • finally:用于定义在无论是否发生异常时都会执行的代码块。
    • throws:用于在方法声明中指定可能抛出的异常。
  7. Java异常处理提供了多种方式来捕获、处理和传递异常。下面是Java异常处理的详细细节:

    1. try-catch块:

      • try-catch块用于捕获和处理异常。

      • try块包含可能引发异常的代码。

      • catch块用于捕获并处理特定类型的异常。

      • 语法:

        try {// 可能引发异常的代码
        } catch (ExceptionType1 e1) {// 处理 ExceptionType1 类型的异常
        } catch (ExceptionType2 e2) {// 处理 ExceptionType2 类型的异常
        } finally {// finally 块中的代码无论是否发生异常都会执行
        }
        
      • catch块可以有多个,用于捕获不同类型的异常。

      • finally块中的代码无论是否发生异常都会执行,通常用于释放资源或进行清理操作。

    2. 异常传递:

      • 当在当前方法中无法处理异常时,可以将异常传递给上层调用方法处理。

      • 使用throws关键字在方法声明中指定可能抛出的异常。

      • 调用方法可以继续传递异常,或在其内部使用try-catch块捕获和处理异常。

      • 语法:

        void method1() throws ExceptionType1, ExceptionType2 {// 方法可能抛出的异常
        }void method2() throws ExceptionType1, ExceptionType2 {method1(); // 异常传递给调用方法处理
        }
        
    3. finally块:

      • finally块中的代码无论是否发生异常都会执行。
      • finally块通常用于释放资源、关闭文件、断开连接等清理操作,以确保代码执行完毕后资源得到正确释放。
      • 无论异常是否被捕获和处理,finally块中的代码都会被执行。
    4. throw语句:

      • throw语句用于显式地抛出异常。

      • 可以使用throw语句在任何地方抛出异常,包括方法中、catch块中或finally块中。

      • 语法:

        throw exception;
        
      • throw语句通常用于在某些条件下抛出特定类型的异常,以使程序进入异常状态。

    5. 自定义异常:

      • 可以通过扩展Exception类或其子类来创建自定义异常类。
      • 自定义异常类可以根据特定的应用程序需求添加额外的属性和方法。
      • 可以在代码中抛出自定义异常并使用try-catch块进行捕获和处理。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【办公自动化】用Python将PDF文件转存为图片(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

目录 一 背景说明 二 原理介绍 三 设计实现 四 参考资料 一 背景说明 项目程序需要进行加密处理。 考虑利用嵌入式芯片的唯一UID,结合Flash读写来实现。 加密后的程序,可以使得从芯片Flash中读取出来的文件(一般为HEX格式)不能…

rsync+inotify实时同步数据

一、相关简介 1、rsync(remote synchronize) rsync是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。   Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp ,scp 相…

前端性能优化汇总

1.减少HTTP请求次数和请求的大小 (三大类) 文件的合并和压缩:(1)(6) 延迟加载:(3)(4) 用新的文件格式代替传统文件格式:&a…

基于LQR算法的一阶倒立摆控制

1. 一阶倒立摆建模 2. 数学模型 倒立摆的受力分析网上有很多,这里就不再叙述。直接放线性化后的方程: F (Mm)x″-mLφ″ (ImL)φ″ mLx″ mgLφ(F为外力,x为物块位移,M,m为物块和摆杆的质量,…

抽象轻松java

嗨嗨嗨! 没想到吧,出现了抽象轻松第4种语言系列(我也没想到) 简单的java程序,看完就懂的简单逻辑——购物车系统 购物车,首先要有商品吧,现实中的商品有什么属性? 名字&#xff0…

CSS详细基础(一)选择器基础

本帖开始,我们来介绍CSS——即,层叠样式表~ 层叠样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。简单的说,层叠就是对一个元…

PostgreSQL 查询某个属性相同内容出现的次数

查询某个数据库表属性 name 相同内容出现出现的次数,并按次数从大到小排序 SELECT name, COUNT(*) AS count FROM your_table GROUP BY name ORDER BY count DESC;示例 select project_id, COUNT(*) AS count from app_ads_positions group by project_id order b…

认证-authentication 和授权-authorization

就好比你可以刷卡进去xxx大厦(认证是本公司职员),但无法刷卡进入金融部门,或 实验部门(因为没有授权)

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下,还能使用proxy代理地址吗? vite的proxy开发环境设置 环境: vite 4…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) …

忽视日志吃大亏,手把手教你玩转 SpringBoot 日志

一、日志重要吗 程序中的日志重要吗? 在回答这个问题前,笔者先说个事例: ❝ 笔者印象尤深的就是去年某个同事,收到了客户反馈的紧急bug。尽管申请到了日志文件,但因为很多关键步骤没有打印日志,导致排查进…

win10 使用cmake + mingw编译LAPACK

参考官网的内容: 适用于视窗的 LAPACK (utk.edu) 第一步下载好源码包: 配置好mingw的路径添加到环境变量中 gcc --version 出现这些就行了. 还有就是吧mingw中的mingw-make.exe重命名为make.exe 下载安装cmake 然后打开 1是源码路径,路径中一定要有CMakeLists.txt如果没…

Java多线程篇(6)——AQS之ReentrantLock

文章目录 1、管程2、AQS3、ReentrantLock3.1、lock/unlock3.1.1、lock3.1.2、unlock 3.2、一些思考 1、管程 什么是管程? 管理协调多个线程对共享资源的访问,是一种高级的同步机制。 有哪些管程模型? hansen:唤醒其他线程的代码…

渗透测试中的前端调试(一)

前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理,包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息,我们就可以更准确地发现网站的漏洞,制定出有效的攻击策略。前端知识对于安全来说,…

Pytorch单机多卡分布式训练

Pytorch单机多卡分布式训练 数据并行: DP和DDP 这两个都是pytorch下实现多GPU训练的库,DP是pytorch以前实现的库,现在官方更推荐使用DDP,即使是单机训练也比DP快。 DataParallel(DP) 只支持单进程多线程…

3、嵌入式系统的启动过程(BoodLoader)

1、系统启动过程 通电 - > 执行BootLoader - > 加载内核 - > 挂在根文件系统 - > 执行应用程序 Windows的启动过程: 通电 - > 执行BIOS - > 加载WinNT内核 - > 挂在文件系统 - > 执行应用程序 二、嵌入式系统的结构 BootLoader 1、BootL…

ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合

目录 一、数据聚合 1.1、基本概念 1.1.1、聚合分类 1.1.2、特点 1.2、DSL 实现 Bucket 聚合 1.2.1、Bucket 聚合基础语法 1.2.2、Bucket 聚合结果排序 1.2.3、Bucket 聚合限定范围 1.3、DSL 实现 Metrics 聚合 1.4、基于 JavaRestClient 实现聚合 1.4.1、组装请求 1…

Tomcat多实例、负载均衡、动静分离

Tomcat多实例部署 安装jdk [rootlocalhost ~]#systemctl stop firewalld.service [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#cd /opt [rootlocalhost opt]#ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz rh [rootlocalhost opt]#tar xf jdk-8u91-linu…

春招秋招,大学生求职容易遇到哪些问题?

每到毕业季就有大批大学生从校园出来,他们怀抱梦想,希望能做出一番成绩。但现实总归是残酷的,有些人找不到工作,有一些人频繁跳槽,也有一些人最终找到的工作与自己的专业没有一点关系,迷茫好几年才找到方向…