深入浅出Java异常机制
一次对Java异常机制的理解
近期有一个对接三方接口的任务,在这个过程中用到了许多 try-catch 处理,发现自己对异常处理是一知半解,浅浅研究了一下,记录一下,也帮助小伙伴如何正确使用 try-catch 达到预期的结果。
写在前面
java的异常处理机制,用得好,可以达到预期的效果,用得不好,反而会降低JVM的性能
try-catch代码段会产生额外的性能开销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异常机制的更多相关文章
- 全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...
- Java 异常机制
Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...
- 【55】java异常机制剖析
一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...
- Java异常机制及异常处理建议
1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- Java异常机制
Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...
- Java异常机制简介
什么是异常? 异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响. Java异 ...
- Java基础 -- 深入理解Java异常机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...
- 一张图搞清楚Java异常机制
下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...
- Java异常机制,自定义异常以及spring boot异常设计方案
异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案
随机推荐
- IntelliJ IDEA Community 无法启动 Spring Boot 项目的解决方案
菜单中依次选择 Run >Edit Configuration 在弹出窗口中,点击左上角的 +,选择 Maven 在 Name 中自定义一个名称,一般与项目名称相同 在 Run 下方的文本框中输 ...
- 报表 BI 选型的那些事
前言 报表工具是一个接近 20 年的产物了 但是,直到现在,在各种数据信息化的系统中,报表工具的作用,不仅没有褪色,反而是因为信息化需求的增大.数据的增多,以及报表工具本身迭代后越来越方便好用,使得它 ...
- 《C# in depth》第5章C#5.0中的更改(十二)——指针和非安全编码
指针类型是一种C# 5.0 中引入的不安全代码特性,它允许程序员直接访问内存地址,以及使用指向变量和对象的指针.指针类型可以帮助程序员处理一些高性能场景,例如在大型数组中查找数据. 指针类型需要使用 ...
- eclipse 汉化语言包/中文补丁/简中设置/中英互换
eclipse 汉化语言包/中文补丁/简中设置/中英互换 汉化很简单,使用eclipse内置的软件下载就可以,不需要下载压缩包 官方的说明 Open the install wizard with ' ...
- 力扣445(java&python)-两数相加Ⅱ(中等)
题目: 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示 ...
- PolarDB助力易仓打造跨境行业生态链协同的产业链SaaS
简介: 2022年7月,易仓ECCANG WMS东南亚版正式上线!经过9年快速发展,易仓已经成为一家跨境全生态综合服务商,也见证了跨境行业从起步到万亿级的增长.而PolarDB作为面向下一代云原生关系 ...
- 为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)
简介: Serverless Devs 离不开对云资源的操作,但支持新资源时需要开发相应的组件代码:如果将环境模板的定义通过 Terraform IaC 来完成,在 Serverless Devs ...
- Hologres如何支持亿级用户UV计算
简介: 本文将介绍阿里云Hologres如何基于RoaringBitmap进行UV等高复杂度计算的方案,实现亿级用户万级标签亚秒级分析,帮助用户从Kylin平滑迁移到Hologres,实现更实时.开发 ...
- RDS PostgreSQL一键大版本升级技术解密
简介: 内容简要: 一.PostgreSQL行业位置 二.PostgreSQL版本升级背景 三.PostgreSQL版本升级解密 四.PostgreSQL版本升级成果 一.PostgreSQL行业位 ...
- [Blockchain] 以太坊主流测试网 ropsten 和 kovan 的区别 以及 如何选择
ropsten 采用 POW (Proof-of-Work)共识机制,挖矿难度系数非常低,容易被攻击,不够低碳环保. kovan 采用 POA (Proof-of-Authority)共识机制,不需要 ...