为什么同样的两层try catch代码,运行结果却不同?


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的问题。