1.什么是异常和异常处理
在我们进行代码变异的过程中,我们的程序在运行时总会出现一些影响程序的事件这就是我们所说的异常。
而对于这些异常我们不能用正常的方法继续运行下去,在运行过程中如果出现了异常,可以抛出一个封装了异常信息的异常类。并将其交给java运行系统。而这个方法会不产生返回值的立刻退出,这就是我们所说的抛出异常。
2.异常的分类
Throwable作为一个最为顶级父类又派生出了Error和Exception两个类。
Error作为一种错误一般时候是系统无法处理的,在出现Error时,JVM一般都会选择直接终止代码。出现这种情况我们一般都会去原程序中直接修改错误的部分而不是通过抛出异常去修改。
Exception是可以被处理的异常,我们一般说的异常处理大部分指的都是对这一部分的处理。而在这一部分中最常出现的就是IOException与RuntimeException.
IOExeption是指流的异常,一般具体体现在输入以及输出上。在读写文件时经常会出现的异常类型。
RuntimeException一般是指运行时抛出异常的超类,一般是程序员的错误。
3.异常处理的方式
(1)try...catch...finally
在Java中如果需要处理异常,必须先对异常进行捕获,然后再对异常情况进行处理。而使用try catch语句,可以有效地对异常进行捕捉和处理。代码如下。
try {
//可能出现异常部分
} catch (IOException e) {
// 异常处理部分
}
可以看到,在这里我们现在在try块中对程序进行异常捕捉,之后在catch块中进行异常处理。
现在我们看加入了finally的情况
在一条语句中,try只能有一个,而catch可以有多个,finally视情况而定可以有也可以没有。如果没有异常,catch块中的语句不会执行,但是finally中的语句一定会执行。finally一般在return之后,因此函数返回值在finally前确定。切记,不要做在finally中加入return,否则会把原来的return覆盖掉。
(2)throw和throws
1.throw出现在函数体里表示抛出了某些异常。
public static void main(String[] args) {
int a=1
if(a=1) {
throw new NumberFormatException();
} else {
System.out.println(a);
}
//function();
}
可以看到在这里系统抛出了一个异常。
在这里throw其实是一种消极处理的方式,在找到异常之后他并未处理只是抛出,他的处理在更上级的代码中。
2.throws一般在代码的开头,和throw相比它更像是一种警告,表示代码中可能会出现某种异常,但是这种异常并不是一定会出现的。只有在这种异常出现时他才会抛出。
4.继承中的异常处理
前辈们的说法已经非常的全面了,在这里我直接引用前北门的说法。
关于子类重写父类方法,主要通过三条原则来确定异常抛出声明的类型。
- 父类的方法没有声明异常,子类在重写该方法的时候不能声明异常;
- 如果父类的方法声明一个异常exception1,则子类在重写该方法的时候声明的异常不能是exception1的父类;
- 如果父类的方法声明的异常类型只有非运行时异常(运行时异常),则子类在重写该方法的时候声明的异常也只能有非运行时异常(运行时异常),不能含有运行时异常(非运行时异常)。
p.s.在这里根据异常处理给出几条平时编程时候的建议。
1.对可能出现的异常一定要用try...catch进行捕捉。
2.对于不必要的异常处理进行避免,异常处理只有在该用时再用,不要用它进行对流程的控制。
3.如果要用throw抛出异常,尽量将其与throws合用对异常进行处理