异常如何找到正确的catch块

时间:2015-06-11 09:52:19

标签: java exception

我想知道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块?

5 个答案:

答案 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 {``    报告文件不存在; }

`