大家好,欢迎来到IT知识分享网。
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
友情提示
- 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
- 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!
1.异常体系
在Java异常这个大家族中,Throwable是这个异常家族中的老大,它下面有两个靠谱老弟,一个叫“Error”,一个叫“Exception”。Error老弟负责错误部门,Exception老弟负责异常部门,它们各司其职。我给它们做了一个结构图:
Throwable在《“全栈2019”Java异常第十六章:Throwable详解》一章中已经介绍过了,Error呢,也在上一章《“全栈2019”Java异常第十七章:Error详解》中介绍过。而Exception我们已经不陌生了,前面文章都和Exception有关,这一章我们再次着重来讲解它。
2.已检查的异常
在《“全栈2019”Java异常第十六章:Throwable详解》一章中,我们知道出于编译时检查异常的目的,Throwable和Throwable的任何子类(除Error和RuntimeException的子类)都被视为已检查的异常。
图中红色部分都是已检查异常。
在Java异常体系中有三种异常:
第一种异常是已检查的异常。
第二种异常是错误。
第三种异常是运行时异常。
Throwable和Exception它们自身及其子类(除RuntimeException类及其子类)都是已检查的异常。
Error及其子类都是错误。
最后还剩下运行时异常没有介绍,下一章着重讲解。
3.异常
“异常”这个词我们并不陌生,在Java异常系列文章的第一篇《“全栈2019”Java异常第一章:什么是异常?》中,我们就认识了异常。经过这几天的学习,我们不断的在熟悉它和运用它,对异常的了解也越来越多。
异常最初就是我们应用程序中出现的不正常情况,当我们应用程序出现不正常的情况时,这个不正常情况怎么用代码来体现?
体现的最好方式就是将不正常情况用类来描述,这样用来描述不正常情况的类被称为异常类。异常类在Java里面指的是Throwable及其子类。其中Exception就是Throwable子类中的一员。
下面我们就通过Exception类来开始学习它。
Exception它继承自Throwable:
从继承关系来看,Exception类及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。从这句话中,我们也得知Exception实际上是用来描述应用程序出现不正常情况最佳方式之一。换句话说,将来我们也会定义自己的异常类,到时候是继承最多的恐怕还是Exception及其子类。
自定义异常在RuntimeException的下一章就会讲解到,到时候我们来一起进行学习。
说完了Exception的继承关系,接下来就不得不提这个已检查的异常,因为它的出现,才使得什么样的异常必须try-catch或throws变清晰明了。比如下面这张图,图中红色部分都是已检查异常:
Exception类及其子类(除RuntimeException类及其子类)都是已检查的异常。
上面刚刚说过,当我们碰到已检查异常时,必须的try-catch或throws。下面我们就来看一个小例子感受一下:
这个例子中Exception是一个已检查的异常,所以它必须try-catch或throws。我们选择的方式是try-catch。
下面来试试throws:
对于异常的处理,我们在《“全栈2019”Java异常第二章:如何处理异常?》一章中学习过。
而throw关键字,我们也在《“全栈2019”Java异常第八章:throw关键字详解》一章中学习过。
最后throws关键字,我们在《“全栈2019”Java异常第九章:throws关键字详解》一章中学习过。
希望小伙伴们各取所需。
4.异常中的常用方法
在讲解异常中的常用方法之前,我想说一下Exception这个类,没有自己定义一个方法,它里面的方法全部都来自于父类Throwable。这里贴出Exception类是怎么写的:
我们把注释拿掉:
大家发现了什么?
全部都是构造方法,没有一个自定义方法。所以说,Exception里面的成员方法全部来自于Throwable。Throwable在前面一章《“全栈2019”Java异常第十六章:Throwable详解》中讲过。
接下来,我们来看看异常中的常用方法有哪些。其实在异常中,我们最常用的方法只有两个:printStackTrace()方法和getMessage()方法。
printStackTrace()
第一个最常用的方法就是printStackTrace(),打印异常堆栈跟踪信息。
下面演示一下。
演示:
请打印异常堆栈跟踪信息。
请观察程序代码及结果。
代码:
Main类:
结果:
该例子中,我们故意制造了一个异常,该异常是FileNotFoundException,它是Exception的间接子类。怎么制造的呢?在创建FileReader对象时,参数传进一个不存在的文件路径:
使其产生FileNotFoundException异常,然后我们对其进行try-catch,在catch代码块中调用异常的printStackTrace()方法打印堆栈跟踪信息,帮助我们找到错误的根源。
printStackTrace()方法是我们实际开发中使用最多的方法,也是我们调试程序时最需要的方法,希望大家可以熟练掌握它。不清楚的小伙伴也可以点击下面文件来进行学习:
《“全栈2019”Java异常第十三章:访问异常堆栈跟踪信息》
《“全栈2019”Java异常第十四章:将异常输出到文本文件中》
getMessage()
第二个最常用的方法是getMessage(),获取异常详细信息。该方法返回一个String,里面存储的就是异常详细信息。
该方法获取的异常详细信息是对该异常的描述。
“对该异常的描述”是什么意思?
就是这个异常是什么,什么情况下会发生这个异常等其他描述。目的只有一个,就是让调用者知道这个异常发生时,该如何去处理。
演示一下getMessage()方法。
演示:
请使用getMessage()方法。
请观察程序代码及结果。
代码:
Main类:
结果:
从程序运行结果来看,控制台上打印出来的部分正是如下图红框中展示的一样:
其实就是printStackTrace()方法输出的一部分,只不过当我们只需要异常详细信息时,我们就直接调用getMessage()方法即可,所以getMessage()方法也成为了我们在日常开发中使用较多的方法,希望大家可以熟练掌握它。
5.最常见的Exception子类(除RuntimeException类及其子类)
最常见的Exception子类(除RuntimeException类及其子类)是IOException类及其子类。
IOException及其子类在实际开发中接触也多。只要是跟文件相关的操作都会有IOException及其子类的存在。
下面来个读取文本文件的例子。
既然是读取文本文件,那就要有文本文件,所以请大家打开IntelliJ IDEA,然后使用IntelliJ IDEA打开你的Java项目或者新建一个Java项目,然后在src目录下新建一个error.txt文本文件:
打开error.txt,在里面写上“abc”文字:
接着,请右键error.txt,选择“Copy Path”复制文本文件的路径:
接着,我们在Main类中创建一个FileReader对象:
再接着,我们将刚刚复制的文本文件路径传进FileReader构造方法的参数中:
这时,我们的FileReader构造方法抛出FileNotFoundException异常,我们需要对其进行try-catch或throws,我们选择try-catch:
然后,我们开始读取文本文件里面的内容:
在这行代码会发生IOException异常,我们对其try-catch:
最后,不要忘了关流,我们将关流操作放在finally代码块里面,由于FileReader对象在try代码块里面,所以需要将FileReader对象的引用提到try代码块的外面:
接下来,我们在finally代码块里面执行关流操作:
整个程序就写好了。
接着,我们来运行这个程序,看看执行结果:
从运行结果来看,程序写得没有问题。
这个例子展示了IOException类及其子类在实际开发中的运用,类似程序还有很多,这里就不一一展示了,大家只要掌握一个即可。
总结
- Exception类及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。
- Exception类及其子类(除RuntimeException类及其子类)都是已检查的异常。
- 在异常中,我们最常用的方法只有两个:printStackTrace()方法和getMessage()方法。
- 最常见的Exception子类(除RuntimeException类及其子类)是IOException类及其子类。
至此,Java中Exception相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java异常第十七章:Error详解
下一章
“全栈2019”Java异常第十九章:RuntimeException详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13134.html