【问题标题】:How is exception handling implemented in Java?Java中的异常处理是如何实现的?
【发布时间】:2013-04-16 23:13:38
【问题描述】:

如何在高级编程语言(如 Java)中实现异常处理?我的意思不是说如何在一种语言中使用异常。我的意思是编译器如何生成我们识别为异常处理的代码(汇编,或一些中间代码,如 Java 字节码),因为最终,计算机只能执行指令;更高级别的所有内容都必须由这些指令组成。

在C语言中,在异常存在之前,你会返回一个错误代码,但是如果一个函数已经返回了一些东西,那又如何呢?也许返回错误代码和实际结果的结构?

【问题讨论】:

  • 你可以认为它有两个可选的返回值。它要么返回一个值(如字符串或数字或什么都没有),要么返回一个错误条件。两者都只是一小部分数据。生成的调用代码必须检测发生了什么并处理它。也许它在那里被抓住了。也许调用方法/函数会返回错误条件。
  • 在 C 中,您还可以使用一对特殊函数(setjmp()longjmp())绕过一个或多个正常函数返回返回到前一点。这些函数记录和恢复结构中/从结构中的最小 CPU 状态(通常只有几个寄存器),以促进这种“跳转”。
  • 4 '非建设性投票'?请。这个问题确实有一个单一的事实答案,可以在 JVM 规范中找到。
  • @LeeMeador 所以,try-block 的作用是让其中的所有函数调用检查返回结构的错误条件部分是否存在 catch 声明的错误,然后跳转到适当的错误处理块,或者如果错误没有被捕获,那么调用堆栈就会继续展开,直到较低的帧捕获它,或者没有剩余的帧并且程序只是终止。对吗?
  • 是的。除了您可以将 JVM 视为在调用堆栈的最顶部放置了一个 catch Throwable。如果您的main“返回”出现异常,它会被捕获在最顶端。我认为如果您正在运行命令行,它会打印一条消息。 JEE 容器做类似的事情。

标签: java assembly exception-handling compilation


【解决方案1】:

编译器在 throw 站点输出一个 athrow 指令 (JVM Specification),并在方法的代码中输出一个 Exceptions 属性 (#4.7.5),显示所有各种 catch 子句的位置、范围它们涵盖的指令,以及它们捕获的异常类型。

【讨论】:

  • 所以,JVM在执行athrow指令后,会检查抛出的对象引用的类型,将其与异常属性中列出的异常进行比较,然后跳转到相应的异常。这是正确的吗?如果异常不在列表中怎么办?
  • 如果异常没有被列表中的任何东西捕获,它会从方法向外传播到调用者,...
猜你喜欢
  • 2021-06-06
  • 2010-10-04
  • 2011-04-12
  • 1970-01-01
  • 2013-03-03
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多