工作中需要用到的Java知识(五)
异常
今天来复习一下异常的内容,在工作中,我们经常会碰到异常,菜鸟教程将异常分为了:
·检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
·运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
·错 误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
我自己理解的话,这三种异常分别为:
检查性异常:可以在编码时被自动检测出来的错误。
运行时异常:需要运行起来才会被发现的异常。
错 误:是不受代码与程序员控制的错误。
接下来介绍一下异常的家族:
这里Throwable类为所有异常类型的父类,他的子类分为错误与异常。异常下又分为IO异常(检查性异常) 与 运行时异常
接下来我将平时可能用到的异常列举一下:
RuntimeException | 运行时异常 |
---|---|
ArithmeticException | 计算时异常(运算条件出现异常) |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
IllegalArgumentException | 非法数据异常(方法参数不合法抛出) |
NullPointerException | 空指针异常 |
NumberFormatException | 数字格式异常(将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常) |
ArrayStoreException | 数组存储异常(试图将错误类型的对象存储到一个对象数组时抛出的异常) |
IOException | IO异常 |
---|---|
ClassNotFoundException | 找不到类异常 |
IllegalAccessException | 非法访问(拒绝访问一个类的时候,抛出该异常) |
InstantiationException | 实例化异常(当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常) |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
FileNotFoundException | 找不到文件异常 |
异常方法在菜鸟教程中有,我就不过多说了,在工作中用到的最多的可能就是 public void printStackTrace() 方法了吧。
注意:
在上面的表格中提到了newInstance方法实例化,他与new是一样的,newInstance方法用在反射,我查了一下,好像新版本下也不太使用了,知道一下就行,newInstance方法与new区别在于:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
接下来再说一下异常应该怎么使用:
1.try…catch
2.当我们有必要执行的内容时可以添加finally,finally部分代码不管有没有捕获异常都会执行。
可以使用多个catch分别捕获不同的异常。
throw与throws的区别
throw关键字可以由程序员自己主动抛出一个异常并进行捕获。
throws在方法名或类名后面抛出异常,在工作中一般为检查性异常,当我们使用方法时,可能某个方法需要抛出这个异常,将其忽略。
我们来举一个例子:
当我们创建文件流的时候发现在类名下有条红线,这说明有检查性错误,让我们来看一下源码:
在源码中这个方法抛出了找不到类异常,所以在使用中,我们也需要抛出这个异常,如下图:
此时我们就看不到检查性异常了,程序也可以正常进行。
总结:
throws表示出现异常的一种可能性,并不一定会发生这些异常,;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。