Java异常处理机制很有意思

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/43015379 前言:在网络上看到一篇《深入理解Java异常处理机制》,看完感觉自己也有一点小想法,的确在很多Java学者的眼里,异常处理机制不就是try catch finally吗,有啥好理解,很多时候,我也经常忽略这方面的内容,感觉没什么有意思的,那么我们来扎个小马步吧。
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/43015379

前言:在网络上看到一篇《深入理解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异常处理机制是很有意思,而不简单。


相关文章
|
2月前
|
Java 程序员
Java中的异常处理机制
【2月更文挑战第22天】在Java编程中,异常处理是一个重要的概念。它允许程序员在程序执行过程中遇到错误时,对错误进行处理,而不是让程序崩溃。本文将介绍Java中的异常处理机制,包括异常的分类、如何捕获和处理异常以及自定义异常等内容。
|
1月前
|
监控 Java
解析Java线程池的异常处理机制
该内容是一个关于Java线程和线程池异常处理的总结。提到的关键点包括: 1. 引用了滑动验证页面和相关文章资源。 2. 区分了`execute`与`submit`在处理线程异常时的区别,`submit`可能会捕获并隐藏异常,而`execute`会直接抛出。 3. 提供了处理线程和线程池异常的建议,如使用try/catch直接捕获,或者自定义线程工厂和未捕获异常处理器。 4. 示例代码展示了如何通过设置`UncaughtExceptionHandler`来监控和处理线程中的异常。 请注意,由于字符限制,这里只提供了简要摘要,详细解释和代码示例请参考原文。
22 3
|
4天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
11 1
|
7天前
|
Java 数据库连接 开发者
Java中的异常处理机制详解
Java异常处理是确保程序健壮的关键,涉及Throwable的Error和Exception子类。Error由JVM抛出,不建议捕获;Exception分为检查异常(需要捕获)和未检查异常。处理异常的关键字有try、catch、finally、throw和throws。最佳实践包括捕获具体异常、不吞没异常、释放资源和避免滥用异常。示例展示了如何在main方法中处理IOException,并在finally块中进行资源清理。
10 1
|
14天前
|
敏捷开发 机器学习/深度学习 Java
Java中的异常处理机制深入理解与实践:持续集成在软件测试中的应用探索自动化测试在敏捷开发中的关键作用
【4月更文挑战第29天】在Java编程中,异常处理是一个重要的概念。它允许开发者在程序执行过程中遇到错误或异常情况时,能够捕获并处理这些异常,从而保证程序的稳定运行。本文将详细介绍Java中的异常处理机制,包括异常的分类、异常的处理方式以及自定义异常等内容。 【4月更文挑战第29天】 随着敏捷开发和DevOps文化的兴起,持续集成(CI)已成为现代软件开发周期中不可或缺的一环。本文将探讨持续集成在软件测试领域内的关键作用、实施策略以及面临的挑战。通过对自动化构建、测试用例管理、及时反馈等核心要素的详细分析,揭示持续集成如何提高软件质量和加速交付过程。 【4月更文挑战第29天】 在当今快速发
|
19天前
|
Java 数据库连接
深入理解Java异常处理机制
【4月更文挑战第24天】本文将探讨Java中的异常处理机制,包括异常的概念、分类、捕获和抛出等方面。通过深入了解异常处理机制,可以帮助我们编写更加健壮的程序,提高代码的可读性和可维护性。
|
25天前
|
监控 Java API
Java基础教程(10)-Java中的异常处理机制
【4月更文挑战第10天】Java异常是运行时错误的对象,分为Error和Exception,Error是系统级错误无法处理,而Exception是可捕获的异常,包括受检异常(需处理)和非受检异常(运行时异常)。异常处理涉及try-catch-finally关键字,try块监控错误,catch捕获异常,finally确保某些代码始终执行。自定义异常通常通过继承Exception子类实现。异常处理原则是尽量复用已有异常类型。当return和finally同时存在时,finally先执行,但finally内对值类型返回值的修改无效。
|
1月前
|
Java 数据库连接 编译器
java异常处理机制二
java异常处理机制二
|
1月前
|
Java
java的异常处理机制
java的异常处理机制
|
2月前
|
Java 程序员 开发者
深入理解Java异常处理机制
在Java编程中,异常处理是确保程序健壮性与稳定性的重要组成部分。本文旨在深度剖析Java异常处理机制的核心概念、结构及其实际应用策略,帮助开发者更好地理解并运用异常处理来优化程序设计。我们将从Java异常体系结构入手,探讨try-catch-finally语句块的执行流程,分析自定义异常的必要性与实现方式,并通过实例演示如何有效地管理和处理异常情况。
23 3