我想知道catch块是如何工作的。
我有以下代码,
catch(ArithmeticException e){
System.out.println("task1 is completed");
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("task 2 completed");
}
catch(Exception e){
System.out.println("common task completed");
}
如果除以零,则会进入算术异常并跳过休息。
它是如何在内部实现的,以便它进入正确的catch块?
答案 0 :(得分:3)
如果“已实现”,则表示“为此生成的字节码是什么”,该部分当然由语言规范涵盖,并且有a good article。
基本上,每个代码段(方法)都可以有一个关联的异常表。在此表中,每个catch块都有一个条目,它指定它所覆盖的代码行(try
块的范围),捕获的异常以及跳转到何处( catch
块。
当引发异常时,JVM从上到下遍历该表,并在匹配的第一个catch块中继续执行。
如果找不到,则退出当前方法并查看调用者的异常表(异常会在调用堆栈中冒泡,直到有人处理它为止)。
答案 1 :(得分:1)
它没有直接进入匹配的catch块......
但是它线性搜索每个catch块以找到所需的异常,如果它找到则它会跳过catch块的其余部分......那就是全部。
答案 2 :(得分:0)
执行第一个匹配的catch块 有关详细信息,请参阅此处:https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
答案 3 :(得分:0)
它没有多大的特定块。在你的try块中,异常可以并且通常被“抛出”你的catch块只是预期异常并“捕获”它阻止程序崩溃。
答案 4 :(得分:-1)
` Java有一个用于处理运行时错误的内置机制,称为异常处理。这是为了确保您可以为任务关键型应用程序编写健壮的程序。
较旧的编程语言(如C)在异常处理方面存在一些缺陷。例如,假设程序员希望打开一个文件进行处理:
1.程序员不了解特殊情况。例如,要打开的文件可能不一定存在。因此,程序员在打开文件之前没有编写代码来测试文件是否存在。
2.假设程序员意识到异常情况,他/她可能会决定先完成主逻辑,然后再编写异常处理代码 - 不幸的是,这个“稍后”通常不会发生。换句话说,您不必强制将异常处理代码与主逻辑一起编写。
3.假设程序员决定编写异常处理代码,异常处理代码与许多if-else语句中的主逻辑交织在一起。这使得主要逻辑难以遵循,整个程序难以阅读。例如,
if(文件存在) {
打开文件;
while(还有更多要处理的记录){
if (no IO errors) {
process the file record
} else {
handle the errors
}
} if(文件打开)关闭文件; } else {`` 报告文件不存在; }
`