- 相较于其他语言的优势,Java的异常机制帮助程序员排查错误
- 可通过JDK API 1.6.0 中文版.chm查询相关信息。
一、常见异常
1.1 不可处理异常:Error
对应的是Jvm虚拟机的内部的一些错误,如堆内存溢出,栈内存溢出。
jvm系统内部错误,资源耗尽等严重错误,不可处理
1.2 可处理异常:Exception类
编译时异常会直接或间接的继承Exception类,运行时异常会继承RuntimeException
1.2.1 运行时异常
- 直接或间接继承了RuntimeExcption:
程序在编译时不会发生任何报错,程序员可处理可不处理,但是不处理可能导致程序不能继续向下执行。
- 空指针异常NullPointException 经常遇见的异常接收过来的引用为
空某参数为空(编译时正常运行时报错)解决方法:对接受过来的引用数据进行非空校验;特别对于web
数组索引越界异常:ArrayIndexOutfBoundException
- 类文件未找到异常:
造型异常/类型转换异常:ClassCastException
1.2.2 编译时异常
直接或者间接继承了Exception
(发生概率较大的异常会定义为编译时异常)一定会报错,要求编程人员一定要进行处理。
- 文件找不到异常:FileNotFoundException
- IOException
二、异常处理机制
2.1 throw方式
throws写在方法名后向调用者抛出;throw是在方法内抛出异常对象;
做判断,抛出异常:throw new 异常名(“提示”)
throws FileNotFoundException 编译时异常,必须处理;
throws NullpointerException 运行时异常;可以不管;
异常处理机制的抛出流程: 通过throws把异常向上抛,通常跟值在方法参数定义后,对整个方法代码进行检测最后抛到主函数再从主函数抛到 jvm虚拟机
异常Exception: 因为编程错误或者偶然的外在因素导致的一般性错误;可处理
2.2 异常处理机制try-catch - finally
try{
具体要被检测的代码部分
} catch(异常类 异常类的引用){
针对该异常的处理;(异常一旦出现一定会进入catch语句块)
}catch( ){
}finally{
该语句必回执行,用于资源回收(一般是指系统资源浪费)}
- catch(异常类 异常类的引用)中可以使用最大的父类Exception异常类来接收;
通过这种方式去处理异常,在捕获异常后,还是会创建该异常对象,但是该异常对象会被catch语句所捕获,具体用异常类来接收该异常对象。
fianlly 做非空校验if(fileinputexception != 0)
//看是否创建了流文件对象;
try{异常对象名. close()}.
//关闭资源的方法;
exception.printStackTrace();//打印日志信息 ;
//强行结束jvm才能让fianlly不执行。
抛出的异常必须是异常能够接受的异常(同类或者父类)
最大父类来接收异常,接收好但是不好处理;
最好精确一点,针对不同异常进行处理;
三、自定义异常:
- Java提供了很多异常,但是这些在项目中并不够用,需要自定义异常;
- 自定义异常流程:
- 直接声明一个类,
如果想定义一个编译时异常让其继承exception
如果想定义运行时异常让该类去继承runtimeexception,<br /> 如果需要构造,通过super把当前类传给父类即可;
public Exception(异常信息String message){
super(message)}
通过throw +异常对象;
- 案例:
需求:自定义一个异常,年龄不能为负数否则抛出异常,AgeException
创建一个用户类User name、age
给age赋值时,如果年龄要是小于0的话,就抛出该异常。