java语法中try--catch--finally用法

目录

案例1 finally无return

案例2 finally中有return

案例3 try中抛出异常被catch捕获,fianlly中无return

案例四 try中抛出异常被catch捕获,fianlly中有return

案例五 try中抛出异常被catch捕获,catch中又抛出异常,,fianlly中无return

案例6 try中抛出异常被catch捕获,catch中又抛出异常,fianlly中有return

案例7 try中抛出异常未被catch捕获,fianlly中无return

案例8 try中抛出异常未被catch捕获,fianlly中有return

案例九 fianlly中抛出异常

总结

注意


案例1 finally无return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			return s;
		} catch (Exception e) {
			s = "catch";
			return s;
		}finally {
			s = "finally";
		}
	}
}
//结果:try

首先程序执行try语句块,把变量t赋值为try,由于没有发现异常,接下来执行finally语句块,把变量t赋值为finally,然后return t,则t的值是finally,最后t的值就是finally,程序结果应该显示finally,但是实际结果为try。

在try语句的return块中,return 返回的引用变量(t 是引用类型)并不是try语句外定义的引用变量t,而是系统重新定义了一个局部引用t’,这个引用指向了引用t对应的值,也就是try ,即使在finally语句中把引用t指向了值finally,因为return的返回引用已经不是t ,所以引用t的对应的值和try语句中的返回值无关了。(通过查看字节码分析)

案例2 finally中有return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			return s;
		} catch (Exception e) {
			s = "catch";
			return s;
		}finally {
			s = "finally";
			return s;
		}
	}
}
//结果:finally

当finally中有return语句,try语句中的return语句会被忽略。可能jvm认为一个方法里面有两个return语句并没有太大的意义,所以try中的return语句给忽略了,直接起作用的是finally中的return语句,所以这次返回的是finally。

案例3 try中抛出异常被catch捕获,fianlly中无return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);
			return s;
		} catch (Exception e) {
			s = "catch";
			return s;
		}finally {
			s = "finally";
			//return s;
		}
	}
}
//结果:catch

这里面try语句里面会抛出 java.lang.NumberFormatException,所以程序会先执行catch语句中的逻辑,t赋值为catch,在执行return之前,会把返回值保存到一个临时变量里面t ',执行finally的逻辑,t赋值为finally,但是返回值和t'有关系,所以变量t的值和返回值已经没有关系了,返回的是catch。

案例四 try中抛出异常被catch捕获,fianlly中有return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);
			return s;
		} catch (Exception e) {
			s = "catch";
			return s;
		}finally {
			s = "finally";
			return s;
		}
	}
}
//结果:finally

由于try语句里面抛出异常,程序转入catch语句块,catch语句在执行return语句之前执行finally,而finally语句有return,则直接执行finally的语句值,返回finally。

案例五 try中抛出异常被catch捕获,catch中又抛出异常,,fianlly中无return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);//异常和return语句顺序调换会编译出错
			return s;
		} catch (Exception e) {
			s = "catch";
			Integer.parseInt(null);异常和return语句顺序调换会编译出错
			return s;
		}finally {
			s = "finally";
			//return s;
		}
	}
}
//结果:java.lang.NumberFormatException

这个例子在catch语句块添加了Integer.parser(null)语句,强制抛出了一个异常。然后finally语句块里面没有return语句。继续分析一下,由于try语句抛出异常,程序进入catch语句块,catch语句块又抛出一个异常,说明catch语句要退出,则执行finally语句块,对t进行赋值。然后catch语句块里面抛出异常。结果是抛出java.lang.NumberFormatException异常。

案例6 try中抛出异常被catch捕获,catch中又抛出异常,fianlly中有return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);
			return s;
		} catch (Exception e) {
			s = "catch";
			Integer.parseInt(null);
			return s;
		}finally {
			s = "finally";
			return s;
		}
	}
}
//结果:finally

这个例子和上面例子中唯一不同的是,这个例子里面finally 语句里面有return语句块。try catch中运行的逻辑和上面例子一样,当catch语句块里面抛出异常之后,进入finally语句快,然后返回t。则程序忽略catch语句块里面抛出的异常信息,直接返回t对应的值 也就是finally。方法不会抛出异常。

案例7 try中抛出异常未被catch捕获,fianlly中无return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);
			return s;
		} catch (NullPointerException e) {
			s = "catch";
			//Integer.parseInt(null);
			return s;
		}finally {
			s = "finally";
			//return s;
		}
	}
}
//结果:java.lang.NumberFormatException

这个例子里面catch语句里面catch的是NullPointerException异常,而不是java.lang.NumberFormatException异常,所以不会进入catch语句块,直接进入finally语句块,finally对s赋值之后,由try语句抛出java.lang.NumberFormatException异常。

案例8 try中抛出异常未被catch捕获,fianlly中有return

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			Integer.parseInt(null);
			return s;
		} catch (NullPointerException e) {
			s = "catch";
			//Integer.parseInt(null);
			return s;
		}finally {
			s = "finally";
			return s;
		}
	}
}
//结果:finally

和上面的例子中try catch的逻辑相同,try语句执行完成执行finally语句,finally赋值s 并且返回s ,最后程序结果返回finally。

案例九 fianlly中抛出异常

public class TryCatchFinally {
	public static void main(String[] args) {
		System.out.println(TryCatchFinally.test());
	}
	private static String test() {
		String s = "";
		try {
			s="try";
			//Integer.parseInt(null);
			return s;
		} catch (NullPointerException e) {
			s = "catch";
			//Integer.parseInt(null);
			return s;
		}finally {
			s = "finally";
			String.valueOf(null);
			return s;
		}
	}
}
//结果:java.lang.NullPointerException

这个例子中,对finally语句中添加了String.valueOf(null), 强制抛出NPE异常。首先程序执行try语句,在返回执行,执行finally语句块,finally语句抛出NPE异常,整个结果返回NPE异常。

总结

1.try、catch、finally语句中,fianlly中无return语句,返回try,catch中的return值或者异常;

2.当finally中有return语句,try或者catch中的return或者异常会被忽略,返回finally中的return值;

3.当fianlly中抛出异常,整个try、catch、finally块中抛出异常.

注意

1 尽量在try或者catch中使用return语句。通过finally块中达到对try或者catch返回值修改是不可行的。

2 finally块中避免使用return语句,因为finally块中如果使用return语句,会显示的消化掉try、catch块中的异常信息,屏蔽了错误的发生。

3 finally块中避免再次抛出异常,否则整个包含try语句块的方法回抛出异常,并且会消化掉try、catch块中的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值