Java异常处理机制很有意思

前言:在网络上看到一篇《深入理解Java异常处理机制》,看完感觉自己也有一点小想法,的确在很多Java学者的眼里,异常处理机制不就是try catch finally吗,有啥好理解,很多时候,我也经常忽略这方面的内容,感觉没什么有意思的,那么我们来扎个小马步吧。


1.经过对原作者的例子改造

package mwq;

public class T1 {

	public static void main(String[] args) {
		boolean b = true;
		try {
			b = tb1();
		} catch (ArithmeticException e) {
			System.out.println("main catch the value of b : " + b);
			b = false;
			throw e;
		} finally {
			System.out.println("main finally b : " + b);
		}

	}

	public static boolean tb1() throws ArithmeticException {
		boolean b = true;

		try {
			if (!tb2()) {
				return false;
			}
		} catch (ArithmeticException e) {
			System.out.println("tb1 catch the value of b : " + b);
			b = false;
			throw e;
		} finally {
			System.out.println("tb1 finally b : " + b);
		}

		return b;
	}

	@SuppressWarnings("finally")
	public static boolean tb2() throws ArithmeticException {
		boolean b = true;

		try {
			System.out.println(1 / 0);
		} catch (ArithmeticException e) {
			System.out.println("tb2 catch the value of b : " + b);
			b = false;
			throw e;
		} finally {
			System.out.println("tb2 finally b : " + b);
			return b;
		}
	}

}
2.我自己感觉有意思的例子
package mwq;

public class T {

	public static void main(String[] args) {
		try {
			System.out.println(1 / 0);
			System.out.println("ccccccccccccccccccc");
		} catch (ArithmeticException e) {
			System.out.println(1 / 0);
			System.out.println("aaaaaaaaaaaaaaaaaaa");
		} finally {
			System.out.println(1 / 0);
			System.out.println("bbbbbbbbbbbbbbbb");
		}
	}

}
第一个例子就不多讲了,如果你的答案如下
tb2 catch the value of b : true
tb2 finally b : false
tb1 finally b : true
main finally b : false
那么,你就不需要你就可以不看原作者的例子了,不过可以读读他那么基础的理论知识。

对于第二个例子,在很多实际的应用中用到的很多,正常流程中,就如try语句,大多数情况下,我们很自觉的加上对应的catch语句,至少是catch Exception,那么这个是没有问题,但是很多时候,我们的catch语句中也有一些逻辑处理,并非简单的输出错误日志,假如我们在catch中再出现错误时,很多时候,catch中我们多数认为是正常的代码,于是我们不再对catch中语句进行catch捕获,那么按照上面的例子,你的答案是这样的吗?


Exception in thread "main" java.lang.ArithmeticException: / by zero
	at mwq.T.main(T.java:13)

错误时代码的13行,为什么不是第10行代码的错误呢,因为finally的作用就是,无论catch有没有捕获到错误,finally都要执行,虽然代码的第10行已经抛出异常了,但是程序会先执行finally而不是将catch的错误在堆栈中打印出来,因为finally中已经出错了,程序要先把finally中的错误进行处理,然后程序将错误打印出来后,就终止了,这个时候第10行的错误也就不会输出了,假如程序是这样的
package mwq;

public class T {

	public static void main(String[] args) {
		try {
			System.out.println(1 / 0);
			System.out.println("ccccccccccccccccccc");
		} catch (ArithmeticException e) {
			System.out.println(1 / 0);
			System.out.println("aaaaaaaaaaaaaaaaaaa");
		} finally {
			System.out.println("bbbbbbbbbbbbbbbb");
		}
	}

}
那么此时你认为结果会是怎样呢,结果有两种
bbbbbbbbbbbbbbbb
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at mwq.T.main(T.java:10)

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at mwq.T.main(T.java:10)
bbbbbbbbbbbbbbbb
为什么会有两种结果呢,大多数情况下,都会先输出bbbbbbbbbbbbbbbbb,然而由于out对象也是输入输出流,JVM在进行处理的时候,少数情况下会将错误信息先打印出来,而后再将out对象的bbbbbbbbbbbbbbb输出出来,这可能是线程调度的原因,但是请小伙伴们怀疑我这种结论,因为我并没有证明是这种情况。

总结:总体而言,我感觉Java异常处理机制是很有意思,而不简单。


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值