异常处理
根据哔哩哔哩网站尚硅谷中的讲师视频所学。
一、异常概述与异常体系结构
1.概述
- 程序执行过程中发生的不正常情况成为“异常”。语法错误和逻辑错误不是异常。
- 异常产生:①系统自动产生的异常对象。②手动产生的一个异常对,并抛出(throw)
2.分类
1)Error
一般不 编写
Java虚拟机无法解决的严重问题。例如:JVM系统内部错误、资源耗尽等情况。例如:StackOverflowError(栈溢出)
- 栈溢出:java.lang.StackOverflowError。
例如:public static void main (String[] args){
main(args)}//自己调自己 - 堆溢出:java.lang.OutOfMemoryError
例如:int[] i1 = new [10241024124];
2)Exception(主要的)
一、 异常举例
例如:
1.空指针访问
2.试图读取不存在的文件
3.网络连接中断
4.数组角标越界
二、 解决方法
- 遇到错误终止程序的运行。
- 编写的时候就及时处理
二、 常见异常
Exception异常分类
- 编译时异常(源程序转为字节码文件)(受检异常):执行javac.exe命名文件时,可能出现的异常。
IOException------>FileNotFoundException
ClassNotFoundException - 运行时异常(字节码文件在内存中加载,运行)(非受检异常)(RuntimeException) :执行java.exe命名文件时,出现的异常。
NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException
NumberFormatException
InputMismatchException
ArithmeticException
三、异常处理机制
- 概述:把异常处理的程序代码集中在一起,和正常的程序代码分开,使得程序简洁,易维护。
- 异常产生:程序执行过程中一旦有异常,就会生成一个异常类的对象,并抛出,抛出以后后面的代码就不执行了。
1.两种方式处理方式
1)try - catch - finally
try - catch - finally 处理编译时异常,运行不确定是否会报错。
针对于编译时异常,一般要考虑异常处理;对于运行时异常,通常不进行处理。
1.格式:
try{
可能会出现异常的代码(要自己有预判)
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}catch(异常类型n 变量名n){
//处理异常的方式n
}finally{
//一定会执行的代码 }
2. 注意点:
2.1 finally是可以选择的
2.2 一旦 try 中的异常匹配了 catch 中的某个异常类,就进入改catch中进行异常处理,处理完成就跳出了catch结构,有finally再执行finally,没有就直接跳出。
2.3 catch中的异常类型如果没有子父类的关系,则声明的上下关系无所谓。(互斥,不影响)
2.4 catch中的异常类型如果有子父类的关系,那么子类必须在上。
2.5 常用的异常对象处理的方式:
① String getMessage( )
② printStackTrace( )
2.6 try 里面的变量,出了try不能调用。可以在外面声明并初始化这个变量,仅仅在try里面使用一下。
2.7 try - catch - finally 可以互相嵌套。
3. finally的使用:
3.1 finally 中声明的是一定会被执行的代码,即使catch中又出现了异常,或者catch中有return,或者try中有return语句等情况。并且,先执行finally的return语句,再执行try或者catch中的语句。
3.2 什么时候需要用finally
比如:数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动进行资源的释放。此时资源释放,就需要声明在finally中。
2)throws + 异常类型
- 指明此方法执行时,可能会出现异常类型。一旦方法体执行出现异常了,仍会在异常代码处生成一个异常的对象,满足“throws + 异常类型”中断异常类型时,就会被抛出。后面的代码就不再执行了。
- “throws + 异常类型”仅是将异常抛给了调用该方法的的调用者,并没有真正处理异常。“try - catch - finally”才是真正的将异常处理掉了。
2.方法重写中的异常类型规则
子类重写的方法抛出的异常类型不大于父类重写的方法抛出的异常类型。
3.如何选择try - catch - finally和throws
- 父类中被重写的方法没用throws方式处理异常,则子类不能用throws只能用try - catch - finally。
- 执行的方法A中,又调用了其它方法,且这些方法和A是递进关系,一般都用throws处理异常。而A就可以使用try - catch - finally处理。
四、手动抛出异常
是否需要处理异常和手动抛出的异常类有关。一般写Exception和RuntimeException两种异常。
-
创建Exception类的异常对象,意思为非运行时异常,考虑了编译时异常。就需要对异常进行处理。
-
-
创建RuntimeException类的异常对象,就不需要对异常进行处理。
五、自定义异常类
- 继承与现有的异常(RuntimeException或Exception)
- 提供全局常量(static final):serialVersionUID
- 提供重载的构造器
RuntimeException也是继承与Exception.此时看看Exception源代码中是怎么写的,模仿。
小点
1)throw和throws的区别:
- throws是一种异常处理的方式,在方法声明处使用。
- throw是异常生成的阶段,手动抛出异常对象,在方法体内使用。