java 异常
一、什么是异常:
异常并不是指程序出错。
java在程序运行过程中,遇到的意外情况,程序本身不知道如何去解决,将这个异常捕获、做处理的一种机制。
异常使用有两种情况,
1、就是程序根据不同的异常,做不同的处理(try ..catch)
2、就是将异常抛出来,再做处理,比如输入用户名密码时,用户不存在,抛出异常给前端页面,前端页面在根据异常情况,提示用户相应的错误信息。
二、异常体系
如上图,异常Exception与错误Error都继承于Throwable。
错误Error是我们处理不了,异常Exception是需要我们处理的。
异常Exception又分为运行时异常RuntimeException 和 受检异常CheckedException。
2.1 受检异常
RuntimeException及其子类,都是非受检异常。其他类都是受检异常。
未处理声明的异常(这个异常是可能抛出的),在编译的时候就会报错(在idea里直接报红)。
简单点说:就是在idea写程序时,如果没有对某个可能抛出的异常/声明的异常做处理,那么这一块代码就会报红。
举个例子:
new FileInputStrem("")文件流这歌个类时,系统提示爆红了,因为 没有对FileInputStrem这个类的异常做处理。
查看FileInputStrem源码:
在定义FileInputStrem这个类时,声明了一个FileNotFoundException异常( 文件找不到的异常)
我们需要对这个异常做处理。
这个异常不是一定发生的,是可能发生的,如果读取文件的时候,这个文件存在,肯定不会出现异常,但是如果文件被删除了,或者文件名字写错了,那读取文件的时候肯定找不到这个文件,发生错误。
处理方式:1、继续将这个异常向上抛出,2、try catch 处理这个异常。
2.2 非受检异常/运行时异常
非受检异常,也被称为运行时异常。在程序运行时,才会报异常。在编译的时候,不会报异常。
如
System.out.println(1/0);
在编译的时候,程序不会报异常,当程序运行时,才会报异常。0是不可以做分母的。
三、对异常的处理
处理异常的两种方式:
1、try catch 对异常做处理
2、继续向上抛出异常(谁调用,谁再来处理这个异常)
处理原则:能处理就处理,不能处理再向上抛出。
3.1 try catch
public class ExceptionDemo {
public static void main(String[] args) {
f();
try {
g();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e){
}
}
public static void f() throws RuntimeException{
}
public static void g() throws FileNotFoundException{
}
}
try 包裹的是有可能抛出异常的代码。
catch 捕获异常,然后处理。可以有多个catch,根据catch捕获的不同的异常,做相应的处理。
注意:
catch可以有多个,捕获的异常。当多个异常有继承关系时,父类一定要写在子类的下面,不然就回报错。
如FIleNotFoundException 继承于Exception,当Exception写在上面时,会报错。