美文网首页Java 杂谈Java程序员专栏
我们来捋一捋JAVA的异常

我们来捋一捋JAVA的异常

作者: 享学课堂 | 来源:发表于2019-07-15 14:18 被阅读3次

享学课堂特邀作者:老顾

转载请声明出处!

前言

小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已,而没有全面的,整体的去了解Java的异常体系。今天老顾就来跟大家一起学习JAVA的异常

3W原则

哪都有的3W原则,JAVA异常也可以总结3W:what、where、why

what对应异常类型:回答了什么被抛出

where对应异常堆栈跟踪:回答了在哪抛出

why对应异常信息:回答了为什么被抛出

异常体系

上图我们看出Throwable是异常的顶级类,Error和Exception是他的子类

Exception又分RuntimeException和非RuntimeException子类

Error与Exception区别

我们看一下他们的概念定义:

Error:程序无法处理的系统错误,编译器不做检查。

Error表示系统致命的错误,程序没法处理。一般是与JVM相关的问题,如系统崩溃,内存溢出,方法调用栈溢出等,如:经常遇到的StackOverflowError、OutOfMemoryError。这种类型的错误,编译器不做检查,都是系统运行过程中发生的。

这些错误靠我们程序本身是无法处理与预防的,遇到了建议直接程序中止、重启。

Exception:程序可以处理的异常,捕获后可处理。

Exception异常是程序能够捕获的,也可以做异常处理,我们要尽可能的去处理,使程序继续运行,而不是中止程序。

总结一下就是Error是程序无法处理的错误,Exception是可以处理的异常。

RuntimeException与否区别

上图中Exception有两种类型的异常,我们来看一下

RuntimeException:不可预知的,程序应当自行避免

何为不可预知?如:数组下标越界,访问对象空指针等,这种异常是我们小伙伴们在编写程序时要尽量避免。也就是我们程序员是能够避免的

如针对空指针异常,我们应该在编程的时候,加上空指针判断,if(obj == null) 如何如何,这样就避免了空指针异常。

非RuntimeException:可预知的,编译器可检查的异常

可预知,如:在我们打开一个文件时,如文件不存在引用的异常。

这种异常编译器会检查出来,必须需要处理的

这个也称之为Checked Exception异常类型

责任归属

我们从责任角度看

1、Error属于JVM需要承担的责任

2、RuntimeException是程序应该承担的责任

3、非RuntimeException(CheckedException)可检查异常是JAVA编译器应该承担的责任

上面代码直观一点:

我们看到Error和RuntimeException编译器是不检查的,而CheckedExcepton异常编译器是检查的,也就是我们程序员是必须要捕获处理的。那怎么处理呢?

1、try-catch方式

用try-catch方式捕获这个异常,可以在catch代码段进行异常逻辑处理,这个就按照实际业务而定。如上图代码是FileNotFound异常,根据这个类型我们就知道是文件句柄不存在,那我们应该做哪些处理。如:提示一下用户该文件不存在

2、上抛异常方式

在复杂的业务中,我们的程序员自己写的模块,很有可能被其他程序员写的模块进行引用,为了能够让其他程序员知道我们模块的异常,并要他们要进行处理,我们就可以采用上抛异常方式

我们看一下上层调用的处理

我们看到上抛异常,是需要调用方进行处理的。那处理的方式是什么呢?其实就是上面讲的try-catch或继续上抛。

常见的Error和Exception

一、RuntimeException

1、NullPointerException - 空指针引用异常

2、ClassCastException - 类型强制转换异常

3、IllegalArgumentException - 传递非法参数异常

4、IndexOutOfBoundsException - 下标越界异常

5、NumberFormatException - 数字格式异常

二、非RuntimeException

1、ClassNotFoundException - 找不到指定class异常

2、IOException - IO操作异常

三、Error

1、NoClassDefFoundError - 找不到class定义的异常

2、StackOverflowError - 深递归导致栈被耗尽抛出的异常

3、OutOfMemoryError - 内存溢出异常

总结

今天老顾介绍了异常的相关知识,这点在我们系统开发时是非常重要的,尤其在我们设计系统时,要定义我们系统自己的异常,这个需要整体规划异常类型、异常Code、异常信息等,能够起到很好的排查问题,并方便捕获处理

小疑惑

在捕获异常时,用到try-catch,会经常用到finally关键字,小伙伴应该都知道这个是保证代码一定会被执行,如:关闭JDBC链接、保证锁unlock等。那小伙伴们猜猜下面两段代码执行结果是什么?

代码一:

代码二:

小伙伴,可以把答案写在评论区中。谢谢!!!

持续关注我,分享更多干货。

相关文章

  • 我们来捋一捋JAVA的异常

    享学课堂特邀作者:老顾转载请声明出处! 前言 小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已...

  • 深入理解JVM之OOM

    做Java程序开发,难免会遇到OutOfMemory,导致的原因也是不尽相同,下面我们来捋一捋OOM出现的场景。一...

  • 我来捋一捋

    人活到这把年纪,很多事情可以想清楚了,尽管有的事情明白得太晚,而有的事情也未必全明白。 让我来捋一捋。 首先,应该...

  • NIO&epoll

      说到NIO,涉及到的知识点有很多,我们来一一捋一捋。 IO   IO(InputStream/OutputSt...

  • Java小白翻身-Excel教程

    嗯,先让我们捋一捋思路吧~ 首先,我们捋一捋思路,顺便复习一下之前保存用户的方法。之前的做法是,如果用户选择【客户...

  • 来,捋一捋我的“喜欢”

    这半年,我用了比以往更多的时间来重新确认我自己,尤其是确认自己的热爱。 不,或许我并无热爱,只有喜欢。 我喜欢做什...

  • 捋一捋

    事件一:关于自己知道的事,别人催我 以前只知道公婆唠叨:水壶里有水、还有饭之类的嫌烦,一次两次也当是刚熟悉过程中的...

  • 捋一捋?

    现实总是恶意满满,叫我拿什么好思维对待 一出生谁不是天真无邪瞪着俩双眼盯着人看毫无防备,之后的事谁又说的准呢 玻璃...

  • 捋一捋

    我所面临的挑战 主要问题1不午睡。异常兴奋,基本晚九点多钟我就会对她失去耐心,最后一小时睡前各种博弈,她总会回答我...

  • 捋一捋

    最近的事情很多,晚上看了场nb和秘密的比赛,很精彩。nb真的很强,第二把看起来都要输了,慢慢翻了,感觉dota就...

网友评论

    本文标题:我们来捋一捋JAVA的异常

    本文链接:https://www.haomeiwen.com/subject/bidgkctx.html