首页 > 解决方案 > Java 内部的异常处理是如何工作的?

问题描述

try 
{
}
catch(ExceptionType name)
{
}

我特别无法理解的一件事是 Catch Block 的论点。我们写“ catch(ExceptionType name) ”到底什么是“ name ”呢?如果“ ExceptionType ”是类,那么“ name ”不应该引用一个对象吗?即使它是一个引用,由于我们还没有创建任何对象,它究竟包含什么?

现在我提出了这个关于异常处理的理论——请纠正我,我弄错了。

CASE 1 - SUPPOSING NO TRY, CATCH BLOCK EXISTS - 如果发生错误,异常处理程序会自动生成一个异常对象[基于异常的类]并将其交给 JVM,然后 JVM 然后返回要显示的函数或崩溃错误在运行时

案例 2 - 如果程序员编写了一个尝试捕获块- 如果发生错误,异常处理程序会生成一个异常对象[基于异常的类],然后它不会转到 JVM,而是首先查看捕获块并尝试将引用变量与异常对象匹配。如果匹配发生,异常处理程序将该对象交给 catch 块引用,然后程序员可以返回他或她选择的函数。但是,如果匹配没有发生,异常处理程序会将异常对象交还给 JVM。

这是异常处理的工作方式吗?

标签: javaexceptiontry-catch

解决方案


“名字”到底是什么?

name就像一个局部变量,它被分配了抛出的异常。或者您可以将其视为方法参数。

如果“ ExceptionType ”是类,“名称”不应该引用一个对象吗?

两者都是:ExceptionType是一个类,并且name是一个对象引用。

我们还没有创建任何对象,它到底包含什么?

无论引发异常的逻辑是什么,都使用new运算符创建它,这就是为什么throw语句几乎总是紧跟在new运算符后面的原因,例如throw new IllegalArgumentException().

如果它是内置异常(如NullPointerExceptionStackOverflowErrorArrayIndexOutOfBoundsException等),则 JVM 运行时创建了异常。

案例 1 - 假设没有尝试,存在捕获块
案例 2 - 如果程序编写了一个尝试捕获块
如果发生错误,异常处理程序会自动生成一个异常对象...

您的术语已关闭:“异常处理程序”是处理抛出异常的代码。参见例如UncaughtExceptionHandler

如果发生错误,无论是否有try-catch语句,JVM 运行时都会创建并抛出异常。

从那以后,异常的处理是一样的,不管异常是系统抛出的,还是我们throw语句抛出的用户定义的异常。


推荐阅读