一次对Java异常机制的理解

近期有一个对接三方接口的任务,在这个过程中用到了许多 try-catch 处理,发现自己对异常处理是一知半解,浅浅研究了一下,记录一下,也帮助小伙伴如何正确使用 try-catch 达到预期的结果。

写在前面

java的异常处理机制,用得好,可以达到预期的效果,用得不好,反而会降低JVM的性能

  1. try-catch代码段会产生额外的性能开销
  2. java每实例化一个Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。

所以结论是:能不用则不用,如要用,尽量使 try 块的代码尽可能的少

1、循环中发生异常,导致循环中断

我现在有一个任务,需要循环去处理,代码如下:

public static void main(String[] args) throws Exception {
try {
// 处理任务
doProcess();
} catch (RuntimeException e) {
e.printStackTrace();
}
} public static void doProcess() {
for (int i = 0; i < 30; i++) {
if (i % 10 == 0) {
throw new RuntimeException("Invalid number");
} else {
System.out.println(i);
}
}
}

我的预期是:当 i = 0,10,20 的时候抛出异常,其余情况打印 i 的值

实际结果:程序直接抛出异常就结束了

后来查了相关资料,发生异常的时候,JVM会把异常往上抛,doProcess方法不能处理这个异常,就抛到了 main 方法中,刚好 main方法能够处理,但是处理完之后,当前的栈帧已经来到了 main线程,也就是说,当异常抛出了 doProcess 方法之后,相当于这个方法已经执行完了。

后续经过改造,来到了version 2.0:

public static void main(String[] args) throws Exception {
// 处理任务
doProcess();
} public static void doProcess() {
try {
for (int i = 0; i < 100; i++) {
if (i % 10 == 0) {
throw new RuntimeException("Invalid number");
} else {
System.out.println(i);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

我的预期是:当 i = 0,10,20 的时候抛出异常,其余情况打印 i 的值

实际结果:程序直接抛出异常就结束了

经过分析,发生异常时,JVM还是会把异常往上抛,被 for循环外try 块捕获了,但是为什么还是没能满足我们的预期,理由还是同上,在循环中发生异常,循环中无法捕获这个异常时,就会继续往上抛,一旦抛出了循环外,标志循环也结束了

继续改造 version 3.0

public static void main(String[] args) throws Exception {
// 处理任务
doProcess();
} public static void doProcess() { for (int i = 0; i < 100; i++) {
try {
if (i % 10 == 0) {
throw new RuntimeException("Invalid number");
} else {
System.out.println(i);
}
} catch (Exception e) {
e.printStackTrace();
} } }

这次程序能满足我的预期了,在循环中发生异常,但是在循环中被捕获了,并没有跳出循环,所以循环还在继续。

通过这次对异常处理的思考,一定要尽可能小的去使用 try-catch,一是能保证代码的正确性,二是能保证jvm的性能。

深入浅出Java异常机制的更多相关文章

  1. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  2. Java 异常机制

    Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...

  3. 【55】java异常机制剖析

    一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...

  4. Java异常机制及异常处理建议

    1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. Java异常机制

    Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...

  7. Java异常机制简介

    什么是异常? 异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响. Java异 ...

  8. Java基础 -- 深入理解Java异常机制

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  9. 一张图搞清楚Java异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  10. Java异常机制,自定义异常以及spring boot异常设计方案

    异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案

随机推荐

  1. Cloud-computing 实验镜像 chinaskills_cloud_iaas.iso chinaskills_cloud_paas.iso

    Cloud-computing 实验镜像 最近因新项目再次进行云计算环境的搭建, 找这两个镜像( 找chinaskills_cloud_paas.iso chinaskills_cloud_iaas. ...

  2. 重新整理.net core 计1400篇[五] (.net core 添加mvc 中间件 )

    前言 前面提过.net core web实际上是一个服务和若干个中间件组成. 现在我们有一个服务了,那么可想而知我们要完成mvc这种功能,我们需要的就是一个中间件. 好的,接下来,我们只要添加中间件即 ...

  3. 如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

    如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事.但是在某些场景下 SSR 还是有意想不到效果. ...

  4. NOIP模拟四

    NOIP模拟四 number 题目描述 现有 \(2^n\) 个点,点编号为 \(0\sim2^n-1\). 定义这些点的一张异或图为: 先选定一个集合 \(S\). 对于原图上编号为 \(x\) 和 ...

  5. 【笔记】go语言--go语言的依赖管理

    [笔记]go语言--go语言的依赖管理 GO语言的依赖管理 依赖的概念,依赖就是第三方的库,即别人已经做好的库 依赖管理的三个阶段 GOPATH,GOVENDOR, go mod 三个阶段 - GOP ...

  6. HarmonyOS NEXT应用开发案例——二级联动

    介绍 本示例主要介绍了List组件实现二级联动(Cascading List)的场景. 该场景多用于短视频中拍摄风格的选择.照片编辑时的场景的选择. 效果图预览 使用说明: 滑动二级列表侧控件,一级列 ...

  7. 阿里云容器服务差异化 SLO 混部技术实践

    ​简介:阿里巴巴在"差异化 SLO 混合部署"上已经有了多年的实践经验,目前已达到业界领先水平.所谓"差异化 SLO",就是将不同类型的工作负载混合运行在同一节 ...

  8. PyQt5编程学习之控件基类QObject深入

    一.QObject描述: PyQt几乎所有的类都是从QObject直接或间接继承的,QObject是所有PyQt类的基类,是PyQt对象模型的核心. 二.基类QObject的功能: (一)操作对象名称 ...

  9. [FE] Quasar 性能优化: 减小 vendor.js 尺寸

    默认情况下,出于性能和缓存的原因,Quasar 所有来自 node_modules 的东西都会被注入到 vendor 中. 但是,如果希望从这个 vendor.js 中添加或删除某些内容,可以如下这样 ...

  10. IIncrementalGenerator 增量 Source Generator 生成代码应用 将构建时间写入源代码

    本文将和大家介绍一个 IIncrementalGenerator 增量 Source Generator 生成代码技术的应用例子,将当前的构建时间写入到代码里面.这个功能可以比较方便实现某些功能的开关 ...