什么是异常传播?

Par*_*war 10 java exception

什么是 异常传播

我试过谷歌但不满意结果.如果可能的话,还请举一些例子来解释.C++,php和java语言更可取.

JB *_*zet 16

令人惊讶的是,它在关于异常Java教程页面中得到了解释.

异常从方法传播到方法,向上传递调用堆栈,直到它被捕获.因此,如果a()调用b(),调用c(),调用d()以及d()抛出异常,则异常将从d传播到c到b传播到a,除非其中一个方法捕获异常.


nal*_*inc 11

简短回答:未捕获的异常在调用堆栈中传播,直到堆栈变空,此传播称为异常传播.

答案长:在方法抛出异常之后,运行时系统在调用堆栈中搜索包含可以处理异常的代码块(异常处理程序)的方法.搜索从发生错误的方法开始,并按照调用方法的相反顺序继续通过调用堆栈.找到适当的处理程序后,运行时系统会将异常传递给处理程序.此外,还有值得注意的一点:

可以说,我们有一系列方法,其中method3()调用method2(),method2()调用method1().所以当

1)在method3()和method3()中发生异常我们没有任何异常处理程序.

2)未捕获的异常将在堆栈中向下传播,即它将检查method2()中的相应异常处理程序.

3)再次在method2中,如果我们没有任何异常处理程序,那么异常再次传播到method1(),在那里它找到异常处理程序.

在此输入图像描述

例:

 class ExceptionPropagation{

  void method3(){
    int result = 100 / 0;  //Exception Generated
  }

  void method2(){
    method3();
  }

  void method1(){
    try{
  method2();
    } catch(Exception e){
  System.out.println("Exception is handled here");
    }
  }

  public static void main(String args[]){
  ExceptionPropagation obj=new ExceptionPropagation();
  obj.method1();
  System.out.println("Continue with Normal Flow...");
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

这里处理异常

继续正常流程......

仅传播未经检查的异常.检查异常会引发编译错误

[1] http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

[2] http://www.c4learn.com/java/java-exception-propagation/


Ank*_*tal 5

每当调用方法时,就会形成堆栈,并且首先从堆栈顶部抛出异常,如果没有捕获,它会从堆栈开始向前移动,直到它没有被捕获.如果异常在到达堆栈底部后仍然未被捕获,则它将传播到JVM并终止程序.

未经检查的异常会在java中自动传播.计划>

public class ExceptionTest {
public static void main(String[] args) {
    method1();
    System.out.println("after calling m()");
}

static void method1() {
    method2();
}

static void method2() {
    method3();
}

static void method3() {
    throw new NullPointerException();
}

}
Run Code Online (Sandbox Code Playgroud)

对于传播已检查的异常,方法必须使用throws关键字抛出异常.计划>

public class ExceptionTest {
public static void main(String[] args)
                throws FileNotFoundException {
        method1();
        System.out.println("after calling m()");
}

static void method1() throws FileNotFoundException{
        method2();
}

static void method2() throws FileNotFoundException{
        method3();
}

static void method3() throws FileNotFoundException{
        throw new FileNotFoundException();
}

}
Run Code Online (Sandbox Code Playgroud)

传播未经检查的异常(NullPointerException)> 传播未经检查的异常(NullPointerException)

使用throws关键字>传播已检查的异常(FileNotFoundException) 使用throws关键字传播已检查的异常(FileNotFoundException)

来自:http://www.javamadesoeasy.com/2015/05/exception-propagation-in-java-deep.html