解析Java-throw抛出异常详细过程

2023-11-18

首先,我们知道Java有3种抛出异常的形式:throw(执行的时候一定抛出某种异常对象), throws(出现异常的可能性,不一定会发生), 系统自动抛出异常。

throw用在一个语句抛出异常的时候,throw (an instance of exception class)比如一个方法/函数里,try{…}catch(Exception e){throw new ArithmeticException(“XXX”);}finally{…};

throws则是用在声明方法可能抛出异常的时候,throw (exception class)比如public int division(int x, int y) throws ArithmeticException {…};

系统自动抛异常则是当程序语句出现逻辑错误,主义错误或类型转换错误的时候,系统自动抛出异常,比如int a = 5; int b = 0; c = a/b; 这个时候移动会自动抛出ArithmeticException。

什么是异常

异常,顾名思义,就是异于正常状态,有错误发生。而这错误会阻止Java当前函数方法的运行。

那么Java里面异常的体系是怎么样的呢?

1.Java里面所有不正常类都继承于Throwable类;而Throwable类包括2类:Error类和Exception类。

2.Error类包括虚拟机错误(VirtualMachineError)和线程死锁(ThreadDeath)。

3.Exception类则是我们在说的异常;包括运行时异常(RuntimeException)和检查异常;这里的异常通常是编码,环境,用户操作输入出现了问题。

4.运行时异常(RuntimeException)包括以下4种异常:空指针异常(NullPointerException),数组下标越界异常(
ArrayIndexOutOfBoundsException),类型转换异常(ClassCastException),算术异常(ArithmeticException)。

空指针异常:

数组下标越界异常:

类型转换异常:

算术异常:

5.最后剩下的检查异常则是剩下各种异常的集合;这里发生异常的原因有很多,文件异常(IOException),连接异常(SQLException)等等;和运行时异常不同的是,这里的异常我们必须手动在代码里添加try…catch…(finally…)语句来捕获处理。

今天又学习到了一些具体的额外的异常:

Throw抛出异常详细过程

和throws声明方法可能会发生异常不同,throw语句则是直接抛出一个异常。

前面有提到,throw (an instance of exception class),这里的一个exception类的实例其实也可以说是一个ExceptionObject(Throwable类或者其子类 的对象;也可以是自定义的继承自Throwable的直接或间接的异常类)。如果,我们用了throw new String(“异常XXX”); 则会在编译的时候报错,因为String 类并不是Throwable类的子类。

接着让我们回到怎么用throw语句的阶段。

一般我们有两种方式来用throw:直接在某处会发生异常的地方用throw语句 或则 用try…catch…finally…用来捕获处理异常和关闭释放资源。

首先是第一种,直接在某处会发生异常的地方用throw语句;这是一种主动的方法,主动抛出异常去处理。而第二种,用try…catch…finally…语句来捕获处理异常和关闭释放资源 则是被动的方法。try里面放入可能会发生异常的语句块,如果在运行期间遇到了异常,则会交给catch来处理异常(catch可以是多个,处理不同的异常),finally则是无论有没有异常发生,只要加上了就会运行。

首先我们来看第一种方法的函数:

我们的int c = 4/2,其实是正确的;但是我们的throw 语句主动抛出了异常,那么程序就会到catch里面找有没有这个异常,有的话进行处理。所以我们要主动抛异常的话,要很确信这个代码一定会发生异常且后期不太会出现变动了(最好放在if条件语句里)。所以我们得到的结果如下:

接着我们来看第二种方法。我们一开始先测正确的,只是把主动抛出的异常语句给注释掉:

因为try里面的语句块没有异常,所以只执行了try和finally里面的语句块。运行的结果如下:

我们接着来测当try里面的语句块有异常,且没有主动抛出异常的时候,try会不会捕捉到异常吧:

得到的结果如下,会去处理异常和执行finally里面的语句块:

最后深入理解一点try里面的异常触发会逐层向上的这个概念。在我们try语句里主动/被动抛出异常的时候,程序会调向调用者程序(上面的例子里就是我们自己这个函数;但有的时候我们会在try语句里执行别的函数比如B,这个函数B里我们假如触发了异常,它会调向try语句所在的函数A),寻找和它相匹配的catch语句,执行catch语句里面相应的异常处理程序;但假如没有找到相匹配的catch语句,那么它会再转向上一层的调用程序…这样逐层向上,直到最外层的异常程序终止程序并打印出stack trace。

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,,咱们下期见。

收藏 等于白嫖,点赞才是真情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析Java-throw抛出异常详细过程 的相关文章

  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve

随机推荐

  • 【华为OD机试真题 JAVA】第k个排列

    JS版 华为OD机试真题 JS 第k个排列 标题 第k个排列 时间限制 1秒 内存限制 262144K 语言限制 不限 给定参数n 从1到n会有n个整数 1 2 3 n 这n个数字共有 n 种排列 按大小顺序升序列出所有排列情况 并一一标记
  • vue 子组件未渲染完成,通过refs调用报错,解决办法。

    在 Vue 中 如果父组件调用子组件的方法时因为子组件未渲染完成而出现错误 一种解决方法是使用 nextTick 方法来等待子组件渲染完成后再进行操作 具体做法如下 在父组件中使用 ref 属性给子组件命名 例如 在模板中给子组件命名为 m
  • C++调用Python程序,无法解析的外部符号 __imp___Py_RefTotal

    C 调用python程序时 出现如下问题 无法解析的外部符号 imp Py RefTotal 无法解析的外部符号 imp Py NegativeRefcount 该符号在函数 import array 中被引用 这是由于安装的python为
  • Linux运维实战:Linux清理僵尸进程

    一 僵尸进程简介 官方解释 当子进程比父进程先结束 而父进程又没有回收子进程 释放子进程占用的资源 此时子进程将成为一个僵尸进程 一般在系统中僵尸进程的关键字为defunct或者dead 僵尸进程一般指进程已经死了或者已经停止运行了 但是它
  • Netty---入门程序,搭建Websocket 服务器

    Netty 常用的场景 1 充当HTTP 服务器 但Netty 并没有遵循servlet 的标准 反而实现了自己的一套标准进行Http 服务 2 RPC 远程调用 在分布式系统中常用的框架 3 Socket 长连接 需要了解的名词 1 Ni
  • 什么是RPC并实现一个简单的RPC

    1 基本的RPC模型 主要介绍RPC是什么 基本的RPC代码 RPC与REST的区别 gRPC的使用 1 1 基本概念 RPC Remote Procedure Call 远程过程调用 简单的理解是一个节点请求另一个节点提供的服务 本地过程
  • screen 使用

    screen 是一款能够实现多窗口远程控制的开源服务程序 基本使用 安装screen yum install screen 创建blackup会话 scrren S blackup 查看已有会话列表 screen ls 恢复会话 scree
  • RabbitMQ消息确认机制

    消息确认 基本流程 说明 生产者发送消息到RabbitMQ Server后 RabbitMQ Server需要对生产者进行消息Confirm确认 消费者消费消息后需要对 RabbitMQ Server进行消息ACK确认 消息确认模式 Rab
  • iterable java_如何在Java中将Iterable转换为Collection?

    iterable java There are various ways to convert Iterable to Collection in Java programming language 有多种方法可以用Java编程语言将Ite
  • BUUCTF--[第二章 web进阶]死亡ping命令

    BUUCTF 第二章 web进阶 死亡ping命令 本文只是对官方wp进行了一点修改 因为在测试过程中发现8080端口弹不回flag 在本地测试也是一样的结果 但是把端口修改成8089 其他端口应该也可以 并且nc监听方式为 nc lvp
  • C++ 之 常量成员函数

    常量成员函数 const member function 可读取类中的数据成员 但不能修改 1 声明 1 1 const 关键字 参数列表后 加 const 关键字 声明为常量成员函数 表明其不被允许修改类的数据成员 下面的类 以年 月 日
  • 【技术经验分享】计算机毕业设计Python+SparkML知识图谱新闻推荐系统 新闻数据分析 新闻爬虫 新闻大数据 新闻可视化 大数据毕业设计 大数据毕设 机器学习 深度学习

    开发技术 Python爬虫 springboot vue js SparkML SparkALS 机器学习 深度学习 协同过滤算法 说明 后端使用SpringBoot Mybatis Plus框架 前端使用Vue js Element Pl
  • Element UI 框架中Loading 区域加载的使用方法

    给自己打个小广告 有开发APP 小程序 网站 后台系统需求 或者 想学习前端的可以私信我哈 Loading 加载用于加载数据时显示动效 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img MgPFZSRk 16602
  • 怎样提升Java水平

    怎样提升Java水平 想更快更好地提高你的Java编程水平 除了在日常工作中积累经验外 你还可以在空闲时间通过学习来提高你的技术技能 首先Java 理论基础不会太差 一个Java基础理论知识都很差的Java程序员 那么你期望他的Java代码
  • docker安装rocketmq4.6.1(精简版)

    一 创建文件 mkdir p usr local rocketmq server logs usr local rocketmq server store usr local rocketmq broker logs usr local r
  • 黑白色老照片一键上色在线工具,让老照片漂亮起来

    每个人家中多少都有一些老旧的黑白照 或是当初拍照时只有拍黑白 跟彩色照片比虽然别有一番风味 但有时候还是会想看如果是彩色不知道会变怎样 会不会更好看 而这款 线上工具就能帮你实现 只要把你的黑白照上传 它就会透过 AI 技术自动帮你上色 我
  • idea中相同包不聚合

    idea中创建子包不折叠 项目场景 问题描述 原因分析 解决方案 项目场景 提示 idea使用中出现的问题 突然发现相同包不能聚合了 问题描述 提示 相同包不能聚合 突然出现很多路径相同的很多包下的文件 原因分析 提示 不小心将设置动了 解
  • 95-38-055-Buffer-UnpooledDirectByteBuf

    文章目录 1 总述 1 1 局部图 1 2 概述 1 总述 1 1 局部图 1 2 概述 Netty的UnpooledDirectByteBuf在NIO的DirectByteBuf上采用组合的方式进行了封装 屏蔽了对程序员不友好的地方 并使
  • 如何使用js创建一个构造函数及重写toString的方法

    在js中使用function可以创建一个函数 也可用创建一个构造函数 这个构造函数可用于实例化对象 代码如下
  • 解析Java-throw抛出异常详细过程

    首先 我们知道Java有3种抛出异常的形式 throw 执行的时候一定抛出某种异常对象 throws 出现异常的可能性 不一定会发生 系统自动抛出异常 throw用在一个语句抛出异常的时候 throw an instance of exce