【Java异常】聊聊异常可能带来的坑

一个活生生的案例

本周帮同事排查了一个问题,比较诡异的是他通过测试,并没有找到根本原因,只是发现有对应的错误日志。 但是其实并没有将堆栈信息打印出来。很难看出问题。添加了 e.printStackTrace();

get exception in exter: / by zero

显示出完整的错误信息。

java.lang.ArithmeticException: / by zeroat com.exception.Test.f1(Test.java:24)at com.exception.Test.f2(Test.java:20)at com.exception.Test.main(Test.java:12)
public static void main(String[] args) {try {Test t1 = new Test();t1.f2();} catch (Exception e) {System.out.println("get exception in exter: " + e.getMessage());}}public void f2() {f1();}public void f1() {System.out.println(10 / 0);}

异常实现原理

我们编写了一个Demo

    public static void main(String[] args) {try {System.out.println("try{}");} catch (Exception e) {e.printStackTrace();} finally {System.out.println("finally");}}

执行之后,生成.class文件, 通过 javap -v 生产对应的字节码文件。

其中有一个异常表,from、to、target表示字节码的行号,当行号在[from,to]之间出现type异常,就会跳转到target行字节码继续执行。对应代码 也就是cacth的部分。而19到24就是catch-> finally的部分。

      Exception table:from    to  target type0     8    19   Class java/lang/Exception0     8    35   any19    24    35   any

在这里插入图片描述

异常性能分析

异常的整体步骤是 new创建异常对象、使用throw异常,打印异常调用链。
new 创建异常
如果我们的函数层级比较深的话,那么整个调用链是比较大。

public class Demo {public static void main(String[] args) {fe();}public static void fe() { fd(); }public static void fd() { fc(); }public static void fc() { fb(); }public static void fb() { fa(); }public static void fa() {RuntimeException e = new RuntimeException("oops!");// 打印strackTraceStackTraceElement[] stackTrace = e.getStackTrace();for (StackTraceElement element : stackTrace) {System.out.println(element);}throw e;}
}

在这里插入图片描述
异常抛出
当异常抛出的时候,之后能够catch的异常的栈可以解决,才不会向上抛异常,所以最好的方式及时处理抛出的异常,否则层级太深,对于性能以及问题排查都不好找。
在这里插入图片描述

最佳实践

在实际编码的时候,我们不仅仅需要在完成需求的同时,也需要考虑各种异常失败的情况,其实就是Deisgn for fail 。把失败处理当成一种错误处理也是一种业务逻辑,很多时候我们的逻辑代码都是在处理异常场景。比如检验参数、状态、数据异常、三方异常等等。所以在实际的编码中,我们需要考虑哪些地方可能会出现错误,那些地方不会。好的工程师的代码应对异常情况处理的更优雅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron执行本地cmd命令

javascript执行本地cmd命令,javascript代码怎么执行_js调用本机cmd-CSDN博客 使用 Node.js 打开本地应用_nodejs启动应用-CSDN博客 笔记:nodejs脚本唤醒本地应用程序或者调用命令-CSDN博客 electron调起本地应用_electron 调用本地程序-CSDN博客 命令行打开vscode 你可以使用…

HP笔记本电脑进入BIOS的方法主要有两种,它们使用场合不同

BIOS(基本输入输出系统)是一种实用程序,它在你按下电源按钮后启动并加载操作系统。无论是要更新HP笔记本电脑的BIOS系统,还是清除前一个系统中的错误,第一步都是进入BIOS实用程序。 在按键输入BIOS设置并对其进行修改…

循环神经⽹络中的梯度算法GRU

1. 什么是GRU 在循环神经⽹络中的梯度计算⽅法中,我们发现,当时间步数较⼤或者时间步较小时,**循环神经⽹络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但⽆法解决梯度衰减的问题。**通常由于这个原因&#xff0…

如何使用CMake查看opencv封装好的函数

当我们有时想查看opencv自带的函数的源代码,比如函数cvCreateImage, 此时我们选中cvCreateImage, 点击鼠标右键->转到定义,我们会很惊讶的发现为什么只看到了cvCreateImage的一个简单声明,而没有源代码呢?这是因为openCV将很多…

Java开发框架和中间件面试题(3)

14.Spring事务中的隔离级别有哪几种? 在TransactionDefinition接口中定义了五个表示隔离级别的常量: 1⃣️ISOLATION DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的可重复读隔离级别;Oracle默认采用的读已提…

在Linux下探索MinIO存储服务如何远程上传文件

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 创建Buckets和Access Keys二. Linux 安装Cpolar三. 创建连接MinIO服务公网地…

JavaWeb—html, css, javascript, dom,xml, tomcatservlet

文章目录 快捷键HTML**常用特殊字符替代:****标题****超链接标签****无序列表、有序列表****无序列表**:ul/li 基本语法**有序列表ol/li:****图像标签(img)**** 表格(table)标签****表格标签-跨行跨列表格****form(表单)标签介绍****表单form提交注意事项**div 标签p 标签sp…

Linux命令-查看内存、GC情况及jmap 用法

查看进程占用内存、CPU使用情况 1、查看进程 #jps 查看所有java进程 #top 查看cpu占用高进程 输入m :根据内存排序 topMem: 16333644k total, 9472968k used, 6860676k free, 165616k buffers Swap: 0k total, 0k used, 0k free, 6…

C++设计模式之单例模式

单例模式 最简单也是被问到最多的设计模式之一,保证一个类只创建一个实例,同时提供全局访问的方法。 懒汉模式 在使用这个实例对象时才去创建,创建对象时加锁保证有且仅有一个(有线程安全问题) 实现方式 静态局部变…

Kubernetes 的用法和解析(K8S 日志方案) -- 8

一、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大多数容器引擎同样被设计成支持某种日志机制。 对…

MySQL——复合查询

目录 一.基本查询回顾 二. 多表查询 三.自连接 四.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 一.基本查询回顾 准备数据库: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为…

linux如何在不重新登录用户的情况下使用户加入的组生效

看下面的两个网上的帖子: linux - Add user to group but not reflected when run "id" - Stack Overflow shell - Reload a Linux users group assignments without logging out - Super User 注:我自己使得用户加入组不重启系统生效的办法…

【IntelliJ IDEA】打开项目Git突然无法识别解决方案

这个问题也是我今天突然偶尔遇到的,当时没在意,项目打开之后又关闭,后来很久才又打开,发现项目明明有git版本控制的,咋突然开发工具右下角没有标识了,然后检查了一下git配置还报错了。 其实从图上我们可以看…

服务器经常死机怎么办?如何处理

关于服务器死机这一话题相信大家是不会陌生的,平时在使用服务器的过程中,或多或少都是会有遇到过。轻则耽误业务开展,重则造成数据丢失,相信每个人都不想碰到服务器死机的情况。下文我也简单的介绍下服务器死机的原因以及对应的预…

安装vcpkg管理opencv的安装+MFC缺失的解决

第一步,出现#include没有办法找到opencv头文件的问题,无法解决 在VC的提示下,安装了vcpkg,然后用vcpkg命令来帮助安装opencv,过程十分顺利。 1. cmd 到命令行窗口; 2. 建立src文件夹,并进入…

Python入门学习篇(五)——列表字典

1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…

001 图书增删改查 SSM MySQL

技术框架:Spring SpringMVC Mybatis JSP MySQL 001 图书增删改查 SSM MySQL package com.demo.controller;import com.demo.pojo.Book; import com.demo.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.spri…

Log4net 教程

一、Log4net 教程 在CodeProject上找到一篇关于Log4net的教程:log4net Tutorial,这篇博客的作者是:Tim Corey ,对应源代码地址为: https://github.com/TimCorey/Log4netTutorial,视频地址为:Ap…

C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区

1、存储区概念 欧姆龙PLC将整个数据存储器分为10个区:输入继电器区、输出继电器区、内部辅助继电器区、特殊继电器区、保持继电器区、暂存继电器区、定时/计数器区、数据存储区、辅助存储继电器区、链接继电器区。 输入输出继电器区 CP1E系列PLC输入继电器区有16…

acwing linux 第七讲 环境变量、管道、常用命令、附录

文章目录 管道 概念 要点 举例 环境变量 查看 修改 常用环境变量 常用命令 系统状况 文件权限 文件检索 查看文件内容 用户相关 其他工具 安装软件 附录 Linux权限 本节课讲解的是管道,环境变量,以及常用命令 管道 概念 管道类似文…