有关Java异常体系
发布日期:2022-03-15 19:30:58 浏览次数:10 分类:技术文章

本文共 2063 字,大约阅读时间需要 6 分钟。

异常也是一种对象,java当中定义了许多异常类,并且定义了基类java.lang.Throwable作为所有异常的超类。Java语言设计者将异常划分为两类:Error和Exception。

Error

        Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。 应用程序不应该 抛出这种类型的对象。 如果出现了这样的内部错误, 除了通告给用户,并尽力使程序安全地终止外, 再也无能为力了。这种情况很少出现,这些错误是不可查的,非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

Exception

        程序本身可以捕获并且可以处理的异常

Exception这种异常又分为两类:运行时异常和编译异常。

1、运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。比如说试图使用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

2、编译异常(受检异常):Exception中除RuntimeException及其子类之外的异常。如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,否则编译不通过。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。

同时

可查异常与不可查异常:java的所有异常可以分为可查异常(checked exception)和不可查异常(unchecked exception)。

1、可查异常:编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除RuntimeException及其子类外,其他的Exception异常都属于可查异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

2、不可查异常:编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。

try--catch--finally

try {       //可能产生的异常的代码区   }catch (ExceptionType1 e) {       //捕获并处理try抛出异常类型为ExceptionType1的异常   }catch (ExceptionType2 e){       //捕获并处理try抛出异常类型为ExceptionType2的异常   }finally{       //无论是出现异常,finally块中的代码都将被执行   }

try代码块:用于捕获异常。其后可以接零个或者多个catch块。如果没有catch块,后必须跟finally块,来完成资源释放等操作,另外建议不要在finally中使用return,不用尝试通过catch来控制代码流程。

catch代码块:用于捕获异常,并在其中处理异常。

finally代码块:无论是否捕获异常,finally代码总会被执行。如果try代码块或者catch代码块中有return语句时,finally代码块将在方法返回前被执行(return后)。注意以下几种情况,finally代码块不会被执行:

1、 在前边的代码中使用System.exit()退出应用。

2、 程序所在的线程死亡或者cpu关闭

3、 如果在finally代码块中的操作又产生异常,则该finally代码块不能完全执行结束,同时该异常会覆盖前边抛出的异常。

public class Main {	public static void main(String[] args) {		int a = test();		System.out.println(a);	}		static int test() {		int a = 3;		try {			Class
aClass = Class.forName(""); a = 4; return a; } catch(Exception e) { e.printStackTrace(); a = 5; return a; } finally { a = 6; System.out.println(a); } }}

  

从代码的结果上来看,虽然catch处有return,但是finally依然执行了,但是返回的a的值是5,并不是6,因此可以印证,finally内的语句,是在return后执行的。

 

转载地址:https://blog.csdn.net/weixin_58104242/article/details/122540226 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:归并排序(递归+非递归)
下一篇:排序算法--快速排序

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月01日 07时11分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章