Java异常执行路径
1 问题引入
public class Test{
public static void main(String[] args) {
int str = getMsg();
System.out.println(str);
//控制台会输出什么?"123"还是"456"
}
public static String getMsg() {
try{
int a = 1/0;
} catch(ArithmeticException e) {
return "123";
}
return "456";
}
}
在上述的代码片段中,程序跑起来会在控制台输出什么?答案是输出了”123”。
在try-catch块中,程序从try块发生异常处直接跳转到异常捕获处,然后顺序执行其后的代码。
2 异常概念
Java的基本理念是“结构不佳的代码不能运行”。改进的错误恢复机制是提供代码健壮性的最强有力的方式。Java使用异常来提供一致的错误报告模型。Java的异常处理的目的是在于通过使用少于目前数量的代码来简化大型的、可靠的程序的生成,并且通过这种方式来让你更加自信。异常处理机制可以降低错误处理代码的复杂度,如果不使用异常,那么就必须检查特定的错误,并在程序的许多地方去处理它,而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能捕获这个错误。这种机制不仅节省代码,而且把“描述在正常执行的过程中做什么事”的代码和“出了问题怎么办”的代码相分离。
2.1 捕获异常
2.1.1 try块
如果在方法内部抛出了异常,(或者在方法内部掉哟个的其他方法抛出了异常),这个方法将在抛出异常的过程中结束。如果不希望方法就此结束,可以在方法内设置一个特殊的块来捕获异常。因为在这个块里尝试各种可能产生异常的方法调用,所以称为try块。
try {
//code that might generate exceptions
}
2.1.2 异常捕获程序
抛出的异常必须在某个地方得到处理,这个地点就是异常处理程序,而且针对每个要捕获的异常,得准备相应的处理程序。异常捕获程序紧跟在try之后,以关键字catch表示
try{
//code that might generate exceptions
} catch(Type1 id1) {
//Handle exceptions of Type1
} catch(Type2 id2) {
//Handle exceptions of Type2
} catch (Type3 id3) {
//Handle exceptions of Type3
}
2.1.3 使用finally进行清理
对于一些代码,可能会希望无论try块内的代码异常是否抛出,它们都能得到执行。这通常适用于内存回收之外的情况,诸如文件的关闭等情况。需要清理的资源包括:已经打开的文件或网络连接,在屏幕上画的图形,甚至是外部世界的某个开关
3 总结
当抛出异常后,有几件事会随之发生。首先,同Java中其他对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径(它不能继续下去了)被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行,这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使恒旭要么换一种方式运行,要么继续运行下去。有了该段描述之后,也就很好理解了开头的代码片段了。