写这篇博客主要是为了对我的实验四做一个总结,谈一下Java异常类的使用。
-
Java异常的分类
当异常发生的时候,我们可以选择忽略、处理和退出;有些异常是因为程序员的原因,有些这是因为程序运行的物理环境出错导致。Java正是根据这些情况,对所有的异常进行了比较好的分类。
Java对所有的异常都归类为throwable父类,并且实现了所有的方法,后面的所有的异常类都相当于一个标识,仅仅需要实现构造器即可。Java对所有的异常有三种分类——Error、RuntimeException、其他Exception。Error就是指由于物理环境出现问题导致的错误,RuntimeException是指由于程序本身存在的问题导致的,其他Exception是指外界问题而不是指程序,但是这个问题是可以在程序内部解决的,比如说文件读取失败了,可以让用户重新输入问题文件名。
Java对这些异常还有一种分类——checked(其他Exception)、unchecked(Error、RuntimeException),checked异常就是如果方法中如果抛出了这个异常,就必须要处理,或者选择上传到调用它的方法来处理,在整个异常链必须要有一个环节去处理,unchecked是我们不需要考虑的,让Java虚拟机来处理就好了。
虽然Java对所有的异常做了很好的分类,但是当程序员自己定义异常类的时候需要自己判断这个异常属于哪类。 -
如何使用异常
在我们构造软件的时候应该怎么使用异常呢,这里给出了我的一些想法。
2.1如果你要设计的是一个API,也就是说你的用户也是程序员,你的里面的方法的异常可以这样来设定。
2.1.1如果你调用的方法里面抛出了异常,你要尽可能去处理,除非应该由异常链上端去处理;
2.1.2我们需要先对判断前置条件,如果说前置条件不满足的话,那说明是哪个编写编写代码的人不符合规范,此时应该抛出RuntimeException来告诉他代码出现问题了。此时,代码在运行时依然有可能出现问题,比如文件读取失败等,这些异常不是他的代码的问题,但是我们又处理不了,所以应该抛出去给上层。
2.1.3我们还需要判断后置条件,这个是在开发阶段才应该进行的,当发布出去后我们应该保证没有问题,我们可以用Assertion机制来处理,你可以把对后置条件的判断整理为一个表达式,assert会根据所跟表达式的trueOrfalse。
2.2如果你要设计的是一个软件,也就是说你的用户是普通人,他们只需要使用你的软件。所以当用户没有按照要求输入了数据后,你不能像对待程序员那样抛出RuntimeException而是检查后告诉用户重新输入。
对此我做了一张图来说明一下: