异常
1、概念
一套用于发现问题、反馈问题以及解决问题的机制
2、Throwable是异常的顶级父类
2.1 子类
- Error
合理的应用程序且不应该试图抓住的一类严重问题(调整外部环境或者需要来解决这个严重问题) - Exception
合理的应用程序且可以解决也可以不解决
2.2 解决(处理)方式(抛出、捕获)
异常解决之后的代码正常执行
2.2.1 抛出
1)如果是在main上抛出异常就是JVM来解决。
2)如果方法上抛出多个异常需要通过,来分隔。
eg:
private static String readFile(String path) throws FileNotExitsException,FileNotFindException{}
在方法里发现问题,反馈问题,添加问题描述信息(向上传递异常类对象)
throw new FileNotFindException(“亲,您的文件类型不对”);
2.2.2 捕获
使用try catch来自身解决异常
方式:
1)想针对方法上抛出的所有的异常进行单独的处理,提供对应多的catch来保证可以做单独处理—分别处理(捕获)
2)想对方法上抛出的异常统一做操作,提供一个catch指定声明类的类型是抛出所有的异常类的统一父类可以做统一操作—统一处理(捕获)
3)针对方法上抛出的异常类做统一处理但是不想指定统一父类可以给这些异常类进行分组,每一组之间通过|来间隔可以做到每一个组
可以做统一处理—分组处理(捕获—jdk1.7出现的)
2.2.3 注意:
1)try块里存放的是有可能出现异常的代码。
2)方法上抛出了多少个编译时异常需要通过多少个catch来捕获
3)catch块会时时检测try块是否出现异常
4)如果try块里有异常发生catch块通过对应异常类类型来捕获对应的异常类对象。
5)catch (FileNotExitsException e)声明一个对象用于来接收传递的异常类对象。
new FileNotExitsException(“亲,盘符找不到”); //返回对应异常的文字性描述
总:
e来接收传递的异常类对象
e指向异常类对象可以调用异常类方法返回问题的描述信息(返回的是私有化属性值)
System.out.println(e.getMessage());
6)打印栈轨迹
catch (NullPointerException e){
//打印栈轨迹
e.printStackTrace();
7)调用方法的地方只关系方法抛出的异常
}
7)自定义异常类
①编译时异常(如果继承编译时异常则是编译时自定义异常类,如果继承运行时异常则是运行时自定义异常类)
②普通类继承异常类就变成自定义异常类
eg:
class FileNotExitsException extends Exception{
//属性
private String message;
//有参构造来进行属性初始化(可以给私有化属性来进行赋值)
public FileNotExitsException(String message){
this.message=message;
}
//获取私有化属性的值
public String getMessage() {
return message;
}
}
2.3 分类
2.3.1 编译时异常
编译时期出错,一定要处理 除了RuntimeException类以及子类之外的所有的异常类都是编译时异常(包含Exception类)
eg:
CloneNotSupportedException克隆不支持异常
ParseException解析异常
2.3.2运行时异常
编译时期没错运行时期有错,可以处理也可以不处理 RuntimeException类以及子类都是运行时异常。
eg:
ArithmeticException算术异常
ArrayIndexoutOfBounds数组下标越界异常
NullPointer空指针异常
ClassCastException类型转换异常
NumberFormatException数字格式异常
方法的重写原则
子类重写方法不能抛出比父类更大范围的编译时异常
3、异常后续处理
友好性界面(用户)
日志(程序员)
4、finally块
1、无论try块是否出现异常一定要执行完的内容
2、try块和catch块一起出现java会默认认为try块里可能有异常出现
3、只有在try块和catch块都有返回值才能保证方法有返回值
4、无论执行try块还是catch块都要执行完finally块的内容
5、只要给定finally块有返回值就能保证方法有返回值
6、在方法后面单独出现也可以保证方法有返回值
7、 看是否开辟了新的空间(是否指向新的地址值),如果是有那try块里返回的内容就不会改变,还是返回挂起前的状态,如果没有(相同的地址值),只是引用那他在finally里的内容会对try块里返回的内容有影响。
int n=3;
try {
//代码从上往下依次编译和执行
//执行到当前代码return 1++;时发现后面有finally块的内容
//要保证一定要执行finally块的内容在方法返回之前
//就只能把当前的执行的值和状态进行挂起不执行(return 3;状态就是方法返回的状态,值就是3)
//接着去执行finall块里的内容--- n++-3++---4,执行完毕finall里的内容接着回头执行之前挂起内容
//挂起内容---return 3;来接着执行方法有了返回值就是3
return n++;
}finally {
n++;
//return n++;//如果finally出现return直接结束方法把之前挂起的内容直接清除掉
}
8、在try和finally里都出现return的话,finally出现return直接结束方法把之前挂起的内容直接清除掉。