public class Test {
public static void main(String[] args) {
try {
try {
int num[]=new int[5];
num[10]=1;
}catch (Exception e) {
System.err.println("内catch");
}finally {
System.err.println("内finally");
}
System.out.println("内输出");
}catch (Exception e) {
System.err.println("外catch");
}finally {
System.err.println("外finally");
}
System.out.println("外输出");
}
}
你这种两次不一致,你都改为System.out.println 输出,不要使用System.err.println 输出,应该都是一致的,详见 这个blog https://blog.csdn.net/amo_te_ama_me/article/details/48288503
代码是由上而下执行,你第五行里面的try会优先执行,第七行进行抛出异常以后,里面的catch会捕获到异常,然后执行第十行,finally是一定会执行的,之后它会捕获你的第一个try中catch的也会捕获到异常,跳转到17行执行,再次执行第一个try中的finally,之后会执行14行22行,程序结束.只所以这样,catch捕获到异常以后会优先执行catch里面的内容,然后再次执行finally内容,之后才会往下执行.
具体执行流程应该是给num[10]赋值时报错,捕获异常,有了“内catch”,执行catch代码块后就会执行finally。之后而因为你在内部try-catch块已经捕获并且对异常进行了处理,外层是不会再感知和打印异常的。就和你在方法内部捕获的异常如果不抛出并处理以后,方法外部就不需要再做处理了。但是finally是你不管有没有异常都会进行处理的。建议还是去了解一下java的异常处理机制吧。
内catch
内finally
内输出
外finally
外输出
先说结论,执行结果肯定是这个,没跑了。无论你Debug多少次,都是这个结果,不会有其他的结果的。
为什么在run的时候会出现这种情况,应该是IDE的问题。