深入浅出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 的异常解决方案
随机推荐
- 英语 one day
前言 I do not know if it work,but just go. 内容 1.quote vt:摘要,引用 n:引语 He quote a passage from the presid ...
- Swin Transformer安装记录(国内源,飞快)
0. 设备环境 ubuntu--20.10 GPU--3080 cuda--11.0 torch--1.7.0 mmcv--1.3.8 mmdetection--2.11.0 所有的git的项目,都可 ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Shape)
一.Shape Shape组件是用于创建2D形状和粒子效果的组件.它可以创建包括圆形.正方形.三角形和多边形等基本形状,同时还可以自定义形状.Shape组件创建各种不同的效果,例如火花.烟雾.雨滴等. ...
- 搞定了 6 种分布式ID,分库分表哪个适合做主键?
大家好,我是小富- 本文是<ShardingSphere5.x分库分表原理与实战>系列的第七篇,目前系列的前几篇制作成了PDF,需要的可以在文末获取下载方式,持续更新中.今天咱们继续一起来 ...
- Docker 内安装 SSH 服务
有时候我们想把 Docker 环境提供给别人,但是又不想提供宿主机,那么可以在 Docker 容器内运行 SSH 服务,使容器保持运行并提供给对方使用即可,下面我们以 CentOS 7.6 的 Doc ...
- 力扣209(java&python)-长度最小的子数组(中等)
题目: 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, ...
- 力扣319(java)-灯泡开关(中等)
题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...
- Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述
简介: 支付宝客户端的动态化技术经历三个阶段:现阶段也就是第三阶段是实体组件+部分光栅化的hybrid模式,Cube 就是该模式下的产物. 如标题所述,笔者将持续更新<Cube 技术解读& ...
- Python采集知网
Python爬虫初探 selenium+beautifulsoup4+chromedriver 安装模块:* import pymssql* pip install bs4* pip install ...
- java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider
解决错误: java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider 整合一遍通用mapp ...