try catch finally 块 与 函数的return

先看一个没有异常的情况
package com.zhao.test;
public class TryTest {
	static public int getValue() 
	{
		int j=9;
		try
		{
			System.out.println("try begin");
			//j=10/0;
			System.out.println("try before retrun");
			return 1;
			//unreachable code
			//System.out.println("try after return");
		}
		catch(Exception e)
		{
			System.out.println(e);
			//return 2;
		}
		finally
		{
			System.out.println("finally");
			//return 20;
		}
		//如果finally中有return的话以下就是unreachable code	
	    j=100;
	    System.out.println("out of try");
	    return j;    
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int k = getValue();
		System.out.println(k);
	}
}


try begin
try before retrun
finally
1


把j=10/0;前的//去掉,制造异常

try begin
java.lang.ArithmeticException: / by zero
finally
out of try
100


可见在j=10/0;中就出现异常就到catch块,try中的return就不能执行,直到执行try-catch-finally外的retrun.

去掉catch中和fianlly中的retrun前面的//,并注释掉try-catch-finally外的一段代码.
try begin
java.lang.ArithmeticException: / by zero
finally
20

在finally时就retrun了,无在catch中retrun;

总结:
1.执行retrun的话就会跳出函数返回了.
2.try-catch-finally的顺序是
没有异常的话,try一直执行至try中retrun前,就会去执行finally中的代码,如果finally中无retrun就会做try中的retrun,try中也没有retrun的话就会做try-catch-finally外的代码了.
如果在try中有异常的话,在异常处就会抛出,try中的就不再执行,去执行catch中的代码(前题是抛出的是catch中的异常,能被catch),catch中如果碰到retrun或到尽头,就会去执行finally中的代码,finally中的代码如有retrun就retrun,无就去catch中的retrun,如果catch都无retrun,就会执行try-catch-finally外的代码.
3.可见finally中的代码是一定会全执行的(retrun前)
4.retrun后的代码是无效的.

你可能感兴趣的:(java,制造,J#)