卷向字节码-Java异常到底是怎么被处理的?(下)

简介: 卷向字节码-Java异常到底是怎么被处理的?(下)

冷知识


再给大家补充一个关于异常的冷知识吧。

image.png


还是上面这个截图。你有没有觉得有一丝丝的奇怪?

夜深人静的时候,你有没有想过这样的一个问题:

程序里面并没有打印日志的地方,那么控制台的日子是谁通过什么地方打印出来的呢?

是谁干的?

这个问题很好回答,猜也能猜到,是 JVM 帮我们干的。

什么地方?

这个问题的答案,藏在源码的这个地方,我给你打个断点跑一下,当然我建议你也打个断点跑一下:

java.lang.ThreadGroup#uncaughtException


image.png

image.png


而在这个地方打上断点,根据调用堆栈顺藤摸瓜可以找到这个地方:

java.lang.Thread#dispatchUncaughtException


image.png


看方法上的注释:

This method is intended to be called only by the JVM.

翻译过来就是:这个方法只能由 JVM 来调用。

既然源码里面都这样说了,我们可以去找找对应的源码嘛。

https://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/5b9a416a5632/src/share/vm/runtime/thread.cpp

在 openJdk 的 thread.cpp 源码里面确实是找到了该方法被调用的地方:


image.png


而且这个方法还有个有意思的用法。

看下面的程序和输出结果:


image.png


我们可以自定义当前线程的 UncaughtExceptionHandler,在里面做一些兜底的操作。

有没有品出来一丝丝全局异常处理机制的味道?

好了,再来最后一个问题:

image.png


我都这样问了,那么答案肯定是不一定的。

你就想想,发挥你的小脑袋使劲的想,啥情况下 try 里面的代码抛出了异常,外面的 catch 不会捕捉到?

来,看图:


image.png


没想到吧?

这样处理一下,外面的 catch 就捕捉不到异常了。

是不是很想打我。

别慌,上面这样套娃多没意思啊。

你再看看我这份代码:

public class MainTest {
    public static void main(String[] args) {
        try {
            ExecutorService threadPool = Executors.newFixedThreadPool(1);
            threadPool.submit(()->{
               int a=1/0;
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你直接拿去执行,控制台不会有任何的输出。

来看动图:



image.png


是不是很神奇?

不要慌,还有更绝的。

把上面的代码从 threadPool.submit 修改为 threadPool.execute 就会有异常信息打印出来了:


image.png


但是你仔细看,你会发现,异常信息虽然打印出来了,但是也不是因为有 catch 代码块的存在。

具体是为啥呢?

参见这篇文章,我之前详细讲过的:《关于多线程中抛异常的这个面试题我再说最后一次!》


最后说一句


好了,看到了这里安排个关注吧。

感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。

目录
相关文章
|
24天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
48 1
|
27天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
78 6
|
24天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
30 1
|
25天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
60 7
|
26天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
52 6
|
29天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
19 1
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
49 2
|
1月前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
88 5
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
40 5
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
67 5