异常处理机制
1. 概念
- **异常**:指程序在运行当中出现的非正常的情况,最终会导致JVM的非正常运行,在JAVA等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常并抛出了一个异常对象。JAVA处理异常的方式是中断处理。 - **分类**:根类是Throwable,其下有两个子类: - **Error**:工程师不能处理,只能避免 - **Exception**:由于使用不当导致,可以避免(RunTimeException:运行期异常) - **处理:** - **抛出:抛出异常并终止程序<br />** - **捕捉:可以继续运行后边的程序<br />** - **错误:只能修改源代码(分配空间不足:硬伤)<br /><br />**
Checked+RunTime异常
- Checked异常:编译期异常,这个就像你的要求超过了计算机的物理限度,是无法实现的,必须处理
- Run Time异常:运行期异常,这个异常可以不处理,留给虚拟机处理,可以意识到犯错的位置
throw抛出异常
1. 使用简析
- **作用**:使用throw关键字在指定的方法中抛出指定的异常 - **使用:** - 在方法名之后声明异常,然后再方法中才能抛出异常; - throw new xxxException("异常产生的原因"); - <br /> - **注意:** - throw关键字必须写在方法的内部 - throw关键字后边new的对象必须是Exception或者Exception的子类 - throw关键字抛出指定的异常对象,我们就必须处理这个异常对象<br />throw关键字后边创建的是RuntimeException或者RuntimeException的子类,我们可以不管<br />throw关键字后边创建的是编译器异常(写代码时报错),那么就要用throws或者try...catch - 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常,如果抛出的多个异常对象有父子关系,那么直接声明父类异常即可
2. 使用场景
- 方法传递参数时:首先要对传递过来的参数进行合法性检验,如果有问题就抛出异常<br /><br /> - 数组越界<br /><br /> - Object类空指针(第二个参数是输出的信息,第一行的方法不会输出自定义信息)<br />**<br />** - **文件名检测(这个是编译异常,需要多次抛出声明,提前解决,或者try...catch:此时不用在main方法处声明)<br /><br />** - **后缀名检测(使用的是文件名异常抛出类的父类,两个一起使用,只需声明父类即可)**<br />
3. 常用异常类
- **NullPointerException类:空指针异常,是运行期异常。** - **ArrayIndexOutOfBoundsException类:数组越界异常,运行期异常** - **Objects.requireNonNull()方法:自动抛出异常** - **FileNotFoundException类:IO流异常(文件名),是****编译期异常****,必须处理** - **IOException类:真正的IO流异常,是前者的父类(filename.endWith()方法可以用来检测后缀名,盲猜是检测字符串后侧小字符串的正确性,确实是)**
4. Trowable中的三个异常处理类
- 输出内容的详细程度不同(输出的内容是类中定义的输出内容)<br /><br />
Try…Catch自定异常
1. 概念
- 简介:异常处理的第二种方式,自己处理异常 - 格式: - try{<br /> 可能产生异常的代码<br />}catch(定义一个异常的变量,用来接受try中抛出的异常对象){<br /> 异常的处理逻辑,捕捉异常对象之后,怎么处理异常对象<br /> 一般在工作中,会把异常的信息记录到一个日志中<br />}<br />...<br />catch(异常类名 变量名){<br /> catch可以多次使用<br />}
2. 使用方法
- 可以直接忽略main方法后的抛出声明,直接在main方法中捕捉并处理异常(这样的异常不是红色)<br /><br />
3. 特殊情况
- 无论如何必须执行的代码的位置 - 使用finally在catch后方声明即可(不能单独使用,必须跟随try,一般用于读取文件后的资源释放)<br /><br /> - finally中的return语句:无论如何都是返回finally中的return内容,就算是try中也有return方法<br />
4. 多异常处理
- 分开单个处理(list.of是在JAVA8之后出现的)<br /> - 多个异常一次捕获,多次处理(需要注释掉第一个异常才会显示第二个异常,也就是一次只能显示一个异常,不是太好用)<br /><br /><br />注意事项:如果两个catch到的变量类型是子父类关系,那么子类必须在上(否则如下报错)<br /> - 多个异常一次捕获一次处理(其实就是上述的后一个catch删去,父类可以接受所有子类)(这样两个异常都可以正常处理)<br /> - 万能异常处理:将IndexOutOfBoundsException改成Exception即可捕获所有的异常<br />
子父类异常
1. 概念
- 如果父类抛出了多个异常,子类重写父类方法的时候,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常 - 父类方法没有抛出异常,子类重写父类该方法的时候也不可抛出异常,此时子类产生该异常,只能捕获处理,不能声明抛出
2. 注意
- 父类异常什么样子,子类异常也就什么样子
3. 使用
- 几种异常继承的演示(所有的子父类异常类型)<br />
自定义异常类
1. 概念
- JAVA提供的异常类不够用,需要自己定义一些异常类
2. 格式
- public class xxxException extends Exception | RuntimeException{<br /> 添加一个空参数的构造方法<br /> 添加一个带异常信息的构造方法<br />} - Exception类<br /> - RuntimeException类(其实就换了一个单词)<br />
3. 注意
- 自定义异常类一般都是以Exception结尾,说明该类是一个异常类 - 自定义异常类,必须得继承Exception或者RunTimeException - 继承Exception:是一个编译期异常,如果抛出了,必须处理(throws或者try...catch) - 继承RuntimeException:是一个运行期异常,无需处理,交给虚拟机处理(中断处理)<br />