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

news2025/1/17 18:03:51

一个活生生的案例

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

get exception in exter: / by zero

显示出完整的错误信息。

java.lang.ArithmeticException: / by zero
	at 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 type
             0     8    19   Class java/lang/Exception
             0     8    35   any
            19    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!");
   
   // 打印strackTrace
   StackTraceElement[] stackTrace = e.getStackTrace();
   for (StackTraceElement element : stackTrace) {
     System.out.println(element);
   }
   
   throw e;
 }
}

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

最佳实践

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

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

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

相关文章

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

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

跟着LearnOpenGL学习9--光照

文章目录 一、颜色二、创建光照场景 一、颜色 显示世界中有无数种颜色,每一个物体都有它们自己的颜色。我们需要使用(有限的)数值来模拟现实世界中(无限的)的颜色,所以并不是所有现实世界中的颜色都可以用…

「数据结构」二叉树2

🎇个人主页:Ice_Sugar_7 🎇所属专栏:初阶数据结构 🎇欢迎点赞收藏加关注哦! 文章目录 🍉前言🍉链式结构🍉遍历二叉树🍌前序遍历🍌中序遍历&#x…

年末汇总⭐️ 我是如何从学生切换到职场人身份的

目录 2023.12.23 天气阴 温度较低 一、Learning 二、Working 三、Living 章末 2023.12.23 天气阴 温度较低 小伙伴们大家好,冬已至 年将末 身为逮虾户的我看到大家的年末总结心中也不由得涌起一股创作热情,奈何没文化&#x…

qt简单连接摄像头

要使用摄像头,就需要链接多媒体模块以及多媒体工具模块 需要在.pro文件中添加QT multimedia multimediawidgets 是用的库文件 QCamera 类用于打开系统的摄像头设备, QCameraViewfinder 用于显示捕获的视频, QCameraImageCapt…

tcp vegas 为什么好

我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…

每日一题:给定一个字符串s,请你找出其中不含有重复字符得最长子串的长度

每日一题&#xff1a;给定一个字符串s&#xff0c;请你找出其中不含有重复字符得最长子串的长度 function getLongSubstring(s){let map new Map();let max 0;let left 0;for(let i0;i<s.length;i){if(map.has(s[i]) && map.get(s[i])>left){left map.get(s…

D3839|完全背包

完全背包&#xff1a; 首先01背包的滚动数组中的解法是内嵌的循环是从大到小遍历&#xff0c;为了保证每个物品仅被添加一次。 for(int i 0; i < weight.size(); i) { // 遍历物品for(int j bagWeight; j > weight[i]; j--) { // 遍历背包容量dp[j] max(dp[j], dp[j…

在线渗透盒子,集成了近百个常见的渗透渗透工具,类似软件商城的工具可以进行工具下载

现在简单统计了一下大概有80个渗透工具左右&#xff0c;3个运行环境&#xff0c;1个破解工具 工具包介绍 该工具是一个类似软件商城的工具可以进行工具下载&#xff0c;工具的卸载&#xff0c;工具的更新&#xff0c;工具编写了自动化的安装脚本&#xff0c;不用担心工具跑不起…

oracle即时客户端(Instant Client)安装与配置

之前的文章记录了oracle客户端和服务端的下载与安装&#xff0c;内容参见&#xff1a; 在Windows中安装Oracle_windows安装oracle 如果不想安装oracle客户端&#xff08;或者是电脑因为某些原因无法安装oracle客户端&#xff09;&#xff0c;还想能够连接oracle远程服务&#…

【数据结构】递归与分治

一.递归 1.递归的概念&#xff1a; 子程序&#xff08;或函数&#xff09;. 接调用自己或通过一系列调用语句间接调用自己&#xff0c;成为递归。 递归是一种描述问题和解决问题的基本方法。 重复地把问题转化为与原问题相似的新问题&#xff0c;直到问题解决为止。 2.递归…

要参加微软官方 Copilot 智能编程训练营了

GitHub Copilot 是由 GitHub、OpenAI 和 Microsoft 联合开发的生成式 AI 模型驱动的。 GitHub Copilot 分析用户正在编辑的文件及相关文件的上下文&#xff0c;并在编写代码时提供自动补全式的建议。 刚好下周要参加微软官方组织的 GitHub Copilot 工作坊-智能编程训练营&…

Blender插件-The Grove 10 树木生长动画植物插件

注意&#xff1a;Blender和The Grove的版本匹配。 亲测Blender 2.9与The Grove 10可以配合使用&#xff0c;Blender 3.6会报错&#xff0c;具体看报错记录。 一、下载 CG咖官网地址&#xff1a; Blender插件-树木生长插件植物生成插件 The Grove 10插件资产库 CSDN下载地址…

AI技术图像编辑 Luminar Neo最新中文 for Mac

Luminar Neo是一款功能强大的AI智能图像处理工具&#xff0c;借助Luminar Neo领先的AI技术和灵活的工作流程&#xff0c;用户可以完成创意任务并获得专业品质的编辑结果。以下是该软件的主要特点和功能&#xff1a; 支持多种文件格式&#xff1a;Luminar Neo支持多种文件格式&…

Prometheus介绍和安装

Prometheus介绍和安装 1. Prometheus介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目&#xff0c;拥有非常活跃的开发人员和用户社区。为强调开源及独立维护&#xff0c;Prometheus于2016年加入云原生云…

N字形变换(麻烦的方法)

class Solution:def convert(self, s: str, numRows: int) -> str:#先判断z有多少隔开s_new""index_now0if len(s)<numRows or numRows1:return sfor i in range(numRows-1,-1,-1):exchange0index_exchangeindex_nows_news[index_now]#计算每一层的差距gap_but…

Git安装和使用教程,并以gitee为例实现远程连接远程仓库

文章目录 1、Git简介及安装2、使用方法2.1、Git的启动与配置2.2、基本操作2.2.1、搭建自己的workspace2.2.2、git add2.2.3、git commit2.2.4、忽略某些文件不予提交2.2.5、以gitee为例实现git连接gitee远程仓库来托管代码 1、Git简介及安装 版本控制&#xff08;Revision cont…

超好用的工具类:并发集合简介--线程安全的HashMap

超好用的工具类&#xff1a;并发集合简介 ConcurrentHashMap,这是一个搞笑的并非HashMap。你可以把它理解为一个线程安全的HashMap. CopyOnWriteArrayList,这是一个List,从名字看就知道它和ArrayList是一族的。 在读多写少的场合&#xff0c;这个List的性能非常号&#xff0c;远…

[足式机器人]Part4 南科大高等机器人控制课 CH10 Bascis of Stability Analysis

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch10 Bascis of Stability Analysis 1. Background1.1 What is Stability Analysis1.2 General ODE Models for Dynamic…

小程序怎么实现会员运营?

充分利用小程序快捷方便的优点&#xff0c;小程序可以融合会员机制的获客、激活、留存、转化几个大的方面。小程序会员机制其实是会员系统的获客、激活、留存和转化的机制&#xff0c;而小程序则是为会员提供注册、服务、购买的场所&#xff0c;是商家连接会员、消费者的重要途…