Java异常处理

异常处理

编程错误可以分成三类:语法错误、逻辑错误和运行错误。

  • 语法错误(也称编译错误)是在编译过程中出现的错误,由编译器检查发现语法错误。
  • 逻辑错误指程序的执行结果与预期不符,可以通过调试定位并发现错误的原因。
  • 运行错误是引起程序非正常中断的错误,需要通过异常处理的方式处理运行错误。

为了避免程序非正常终止,保证程序的稳定性,需要使用异常处理的功能。

Java 提供了 try-catch 块的结构,用于捕获并处理异常。

该结构包括 try 块和 catch 块两部分,分别以关键字 try 和 catch 开始,catch 块包含特定异常类型的参数。

在 try 块中包含可能抛出异常的语句,当 try 块中的一个语句抛出异常且和 catch 块的参数的异常类型一致时,try 块中剩下的语句会被跳过,catch 块中的语句会被执行。

Java 的异常类型是 Exception类,它是 Throwable类的子类。

Exception类描述由程序和外部环境引起的错误,可以通过程序捕获和处理这些异常。 Exception类有多个子类,分别描述特定的异常。

Java 的异常处理基于三种操作: 声明异常、抛出异常和捕获异常

如果一个方法可能抛出异常,则需要在方法声明中 使用关键字 throws 声明异常。如果一个方法可能抛出多种类型的异常,则需要在关键字 throws 之后依次列举可能抛出的异常类型。

如果程序检查到错误,则可以创建一个异常的实例并抛出该异常实例。 使用关键字 throw 抛出异常。

需要注意声明异常的关键字 throws 和抛出异常的关键字 throw 的区别。

捕获异常通过 try-catch 块实现。

每个 catch 块包含一个特定异常类型的参数,如果需要捕获多种异常,则需要使用多个 catch 块,每个 catch 块分别包含一个特定异常类型的参数。

如果 try 块的执行过程中没有出现异常,则跳过 catch 块。

如果 try 块中的一个语句抛出一个异常,则跳过 try 块中剩下的语句,寻找可以处理该异常的代码,处理异常的代码称为异常处理器。具体而言,依次检查每个 catch 块,寻找可以处理该异常的 catch 块。

如果发现一个 catch 块的参数的异常类型和抛出的异常实例匹配,则将异常实例赋给该 catch 块的参数,执行该 catch 块的语句。

如果在当前方法中没有发现异常处理器,则异常没有被捕获和处理,退出当前的方法,并将异常传递给当前方法的调用者,继续寻找异常处理器。

如果一个 catch 块可以捕获一个父类的异常对象,则该 catch 块也能捕获该父类的所有子类的异常对象。

由于父类包含子类,因此需要注意 catch 块的顺序,子类异常对应的 catch 块必须出现在父类异常的 catch 块之前,否则会出现编译错误。

有时,无论异常是否出现或者被捕获,都需要执行一些语句,可以通过 finally 子句实现。使用关键字 finally 声明 finally 子句。

如果在 try-catch 块中包含 return 语句,finally 子句将在方法返回之前被执行。

Original: https://www.cnblogs.com/radish40/p/16316308.html
Author: 萝卜不会抛异常
Title: Java异常处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594572/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 分布式中灰度方案实践

    让请求在导航的服务节上点执行; 一、背景简介 分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版…

    Java 2023年6月15日
    074
  • PHP上传文件类型检查

    Original: https://www.cnblogs.com/wxweven/archive/2012/11/13/2768410.htmlAuthor: wxwevenTi…

    Java 2023年6月9日
    068
  • Win10 系统中修改电脑 系统user 名称

    以下步骤来自于:南京邮电大学 ,22级,继教院,通信工程专业,王骏 同学的分享 1.win+R 输入regedit 回车,进入注册表。 2.定位到HKEY_LOCAL_MACHIN…

    Java 2023年6月14日
    088
  • 异步线程里的日志不好追踪?小支一招,轻松搞定!

    众所周知,通过唯一的链路id来追踪一次请求的所有日志,对于排查生产问题来说,会是非常给力的。这个比较容易实现。我之前的博客也有多次提及 ▄︻┻┳═一 https://www.cnb…

    Java 2023年6月15日
    074
  • 0.前言 在学习Java高级之前的一些想说的话

    在学习Java高级之前的一些想说的话 1.将会学到什么? IO流 线程 网络编程 XML解析 设计模式 当然,真正的JAVA高级对于每个人或者每个组织的定义可能都不太一样,这里所讲…

    Java 2023年6月13日
    085
  • Java核心技术-反射

    Day2 利用反射分析类的能力 在Java.lang.reflect包中有三个类Filed Method Constructor,分别用于描述类的字段,方法和构造器。 这三个类有一…

    Java 2023年6月5日
    0124
  • CentOS7-ElasticSearch的使用

    1.下载 ElasticSearch官方下载地址​www.elastic.co/cn/downloads/past-releases#elasticsearch 最好选择版本7.x…

    Java 2023年6月7日
    081
  • python协程–asyncio模块(基础并发测试)

    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行…

    Java 2023年6月14日
    077
  • 还在纠结报表工具的选型么?来看看这个

    数据信息化的应用与项目中,通常都会遇到报表需求,数量少的,零星需要做的,可能手工就搞定了,数量多的,长期做的,基本都会选用一个报表工具,因为长期做,就必须考虑成本了,找一个称手的工…

    Java 2023年6月15日
    084
  • java实现微信公众号的模板消息推送

    文章目录前言一、什么是模板消息二、获取模板ID三、获取access_token四、发送消息五、完整的代码总结前言最近做项目时需要用到公众号的模板消息,所以在这里记录分享一下实现过程…

    Java 2023年5月29日
    074
  • Java随谈(四)JDK对并发的支持

    Java对并发的支持 在Java诞生之时,Java设计者们就考虑了并发的问题,但受限于当时的技术和需求,只是对其进行了简单的支持。 随着时代更替( 多核处理器的普及,提高了程序员对…

    Java 2023年6月8日
    073
  • 【力扣】525. 连续数组

    给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。 示例 1: 输入: nums = [0,1]输出: 2说明: [0, 1…

    Java 2023年6月8日
    064
  • java 递归实现树形结构的两种实现方式

    1.情景展示 树形结构,和我们平常所触及到的无限级菜单,是同一个道理。 所谓树形结构,我们可以将其理解为:树根或者树冠,都可以无限分叉下去。 现有一张表,需要对表中数据进行分级查询…

    Java 2023年5月29日
    0115
  • 华为交换机–项目二

    知识点 对于vlan的理解和静态路由的配置,并熟悉 交换机配置的各种常用命令。能对虚拟局域网配置是否正确进行测试 实验要求 按照下面的网络模型图,进行VLAN的配置。 计算机 PC…

    Java 2023年6月15日
    089
  • 硬核剖析Redis单线程为什么那么快?

    Redis目前是使用率最高的内存库数据库,是企业应用开发的必备,它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。它每秒可以承受10W+的QPS,但却是单线程的处理模型,为…

    Java 2023年6月16日
    0102
  • Java队列使用举例

    import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.util.LinkedList; impo…

    Java 2023年5月29日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球