java - 在运行时执行带有已检查异常的方法调用而不捕获它的行为

标签 java jvm

假设我在一个 jar 文件 a.jar 中有一个名为 A 的调用者类,它调用一个单独的 jar 文件 b.jar 中的方法,比如 B.b()。

直到一切正常。

现在 B 包开发人员正在向 B.b() 添加一个已检查的异常,这将变得类似于 B.b() 抛出异常并重新部署 b.jar 文件。 a.jar 文件保持完整,未受影响,因此 A 包开发人员不会注意到需要立即捕获异常的编译错误。

运行时会发生什么?更准确地说,JVM 如何处理这个问题。根据我的经验,但令人惊讶的是,在运行时实际上没有抛出异常的情况下,它可以顺利运行。因此,即使签名在异常级别不匹配,方法解析也会执行。另一方面,如果 B.b() 实际上抛出异常,我不知道会发生什么。此行为是在 JVM 或 Java 语言规范中指定的,还是由 JVM 实现者决定,或者甚至可以使用某些 JVM 标志选项进行配置?

感谢您的澄清

最佳答案

异常不是方法签名的一部分,至少对于识别哪个方法是正确的。此外,在虚拟机级别,不存在“受检查异常”之类的东西。你可以抛出任何你喜欢的东西,即使你的方法的签名没有声明它。您认为 lombok 的 SneakyThrows 或 scala 如何工作?

关于java - 在运行时执行带有已检查异常的方法调用而不捕获它的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63724788/

相关文章:

java - 由 : java. lang.ArrayIndexOutOfBoundsException 引起:数组索引超出范围:0

java - 将 keystore 密码从无密码更改为非空密码

java - 不确定如何使用 swing 绘制矩形

java - 我可以在内存不足异常时自动重启tomcat jvm吗

java - 单例对象是否有资格进行垃圾回收?类中的静态字段如何进行垃圾收集?

Java 64 位 - 整数与短整型

java - 如何获取ActiveMQ中所有排队的消息?

java - 在不同的程序中同时使用同一个数据库

Java VM - JDK 8 的 DCEVM 更新

java - Java 中守护线程和非守护线程的优先级