1. 定义和意义
定义:
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止。在Java中即,Java在编译或运行或者运行过程中出现的错误。
意义:
- 当异常发生时,能够将异常通知给编程人员或者用户。
- 使本来已经中断的度程序以适当的方式继续运行,或者退出。并且能够保存用户的回当前操作,或者进行数据回稳。
- 最后再把占用的资答源释放掉。
2. 分类
-> Error:程序自身无法处理的异常。
-> Exception:程序自身可以处理的异常。
-> 检查性异常:编译时就被检测出的异常。
-> 非检查性异常:编译时被忽略,运行时被检测出的异常。
3. 异常处理
抓抛模型
- 过程一:“抛”
程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类对象,并将此对象抛出。一旦抛出对象后,其后的代码就不再执行。
关于异常对象的产生:
①自动生成异常对象。
②手动生成异常对象,并抛出(throw)- 过程二:“抓”
处理异常的方式:
①try-catch-finally
②throws
3.1 try-catch-finally
//真正将异常处理掉
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}finally{
//释放资源
}
- 可以只有try和catch,finally非强制要求。
- catch里面不能为空,必须要有处理异常的代码。
- catch可以有多个,分别针对不同类型的异常进行处理。
- 异常类型同级,catch之间的顺序可以随意;异常类型不同级,类型级别高的catch要放在级别低的后面。
- finally里的代码一般来说是一定会被执行的。除非try前已有return语句或者try中有System.exit(); 。
- try-catch-finally可以嵌套使用。
- 常用的异常对象处理方式:①String getMessage() ②printStackTrace() 。
- 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,需要手动释放资源,将其声明在finally中。
- finally的return会覆盖try和catch中的return。
3.2 throws和throw
修饰符 返回值类型 方法名(参数) throws 异常类型1,异常类型2 … { }
throw new 异常类型(参数);
//只是声明但不处理异常
修饰符 返回值类型 方法名(参数) throws 异常类型1,异常类型2 ... { }
//明确抛出异常对象
修饰符 返回值类型 方法名(参数) throws 异常类型{
throw new 异常类型(参数);
}
3.3 何时用try-catch-finally和throws
- 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,若有子类方法有异常,只能用try-catch-finally。
- 执行的方法中先后调用另外几个方法,这几个方法是递进关系,建议这几个方法使用throws,执行的方法使用try-catch-finally。
4. 自定义异常
//创建一个新的类,一般继承Exception
public class MyException extends Exception{
//参照Exception源码写需要的方法
}