java - 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。
这是异常处理的工作方式吗?
解决方案
“名字”到底是什么?
name
就像一个局部变量,它被分配了抛出的异常。或者您可以将其视为方法参数。
如果“ ExceptionType ”是类,“名称”不应该引用一个对象吗?
两者都是:ExceptionType
是一个类,并且name
是一个对象引用。
我们还没有创建任何对象,它到底包含什么?
无论引发异常的逻辑是什么,都使用new
运算符创建它,这就是为什么throw
语句几乎总是紧跟在new
运算符后面的原因,例如throw new IllegalArgumentException()
.
如果它是内置异常(如NullPointerException
、StackOverflowError
、ArrayIndexOutOfBoundsException
等),则 JVM 运行时创建了异常。
案例 1 - 假设没有尝试,存在捕获块
案例 2 - 如果程序编写了一个尝试捕获块
如果发生错误,异常处理程序会自动生成一个异常对象...
您的术语已关闭:“异常处理程序”是处理抛出异常的代码。参见例如UncaughtExceptionHandler
。
如果发生错误,无论是否有try-catch
语句,JVM 运行时都会创建并抛出异常。
从那以后,异常的处理是一样的,不管异常是系统抛出的,还是我们throw
语句抛出的用户定义的异常。
推荐阅读
- python - 如何解决将行分配给单个TestCase
- spring-boot - 如何将jvm参数传递给tomcat中的spring boot deploy?
- git - 复制到 Github 时,Git push 似乎挂起
- c# - 如何在项目之间共享常量?
- c# - 正确转义正则表达式中具有特殊含义的字符
- reactjs - 如何将状态传递给组件
- python - 与 Django 2.0 中的默认管理员用户连接
- scala - 播放:代码更改时重新启动需要很长时间才能关闭和启动 Hikary 池
- java - 在 Java 中将项目添加到数组中
- c++ - 使用 GCC 编译器将代码从 OpenVMS 迁移到 Linux -> 错误:ClassName::Func() 是私有的