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/
每当调用方法时,就会形成堆栈,并且首先从堆栈顶部抛出异常,如果没有捕获,它会从堆栈开始向前移动,直到它没有被捕获.如果异常在到达堆栈底部后仍然未被捕获,则它将传播到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)>
使用throws关键字>传播已检查的异常(FileNotFoundException)
来自:http://www.javamadesoeasy.com/2015/05/exception-propagation-in-java-deep.html
| 归档时间: |
|
| 查看次数: |
31962 次 |
| 最近记录: |