异常:程序运行过程中出现的意外情况。
(程序运行中可能遇到一些意外情况,可能导致程序中断或奔溃。因此要处理异常,让程序正常稳定运行。)
处理或声明原则:
发生异常的方法 ,可以自行处理异常或把异常返回给方法调用者,告知调用者有问题发生。
因此处理有潜在异常的方法时,有2种方法:
1.在调用可以引发异常的方法时,捕获并处理该异常;
2.声明该方法可能抛出异常。
一、异常的层次结构:
Throwable : Error ,Exception
Error:非常严重的系统错误,一般指虚拟机内部出现的问题。这部分由JVM承担。
Exception:指可能恢复的异常情况。Exception又分为运行时异常(RuntimeException),非运行时异常
RuntimeException:(RuntimeExcetion及其子类)又称为非受检异常。是程序设计或实现缺陷造成的,可避免。运行时异常不处理,也不会有语法错误。如:类型转换异常、数组角标越界、空指针、算术异常、方法接受到非法参数、数字格式化异常
非运行时异常:(不是RuntimeException子类的异常)由程序外部问题引起的异常。如要操作的文件无法找到、网络不畅通。这类异常必须处理,不处理会出现语法错误,不能正常编译。又称为受检异常。
如:要加载的类没找到、IO异常、要操作的文件未找到、有关数据库的操作时的异常、线程终端
二、异常的处理
异常抛出:程序运行中发生异常,会自动生成一个对应的异常类的对象,该异常对象会自动提交给Java运行时系统,这个过程称为异常抛出。
捕获异常:当java运行时系统接收到某个异常对象时,会在抛出异常位置附近寻找能处理这一异常的代码,并把异常对象交给这段处理代码。
处理异常:在获取到异常的代码段里,可以对异常进行相应的处理。
如果java运行时系统找不到可以捕获异常的代码,则运行时系统将终止,相应的JAVA程序也中断。
处理异常的常用方法:常用捕获异常 和 声明异常
1.捕获异常:(常用)
try、catch、finally语句
try监控异常,catch接受异常,当异常和catch后的异常类型匹配时,则调用catch后的异常处理代码。
try{
可能出现异常的代码
}catch(异常类型 e){
对异常类型匹配的异常,进行异常处理
}
try后面可以跟多个catch,用来匹配多种类型的异常,不同的类型,不同的处理。
try{
可能出现异常的代码
}catch(异常类型1 e){
和异常类型1匹配的异常的处理
}catch(异常类型2 e){
和异常类型2匹配的异常的处理
}
finally语句跟在try后,或catch后,表示无论是否有异常,始终执行。(常用来释放资源、关闭连接等)
try代码块中,即使包含return ,break,continue, 那么finally代码块也会先执行,然后再返回。除非JVM被关闭。
注意:
try语句块中的代码通知执行效率低。因为要耗费资源监控、评估,所以最好只把可能会有异常的代码放到try中。
多个catch匹配异常类型,按先后顺序,所以一般把子类写在前面,父类写在后面。
try语句块,不能单独存在,try后面可以只跟catch或只跟finally。try后面只跟finally用的很少,因为会导致异常的丢失,不利于程序排错。
2.手动抛出异常(不常用)
语法: throw后跟异常对象。需要先创建异常对象(参考Throwable构造器),然后在代码中手动抛出。(一般在方法体中)作用:告知方法调用者。(抛出运行时异常,必须处理或声明。捕获手动抛出的异常,失去意义)
如 if(n==0){
throw new IllException("不能为0");
}
3.声明异常(常用)
一个方法可能出现异常:处理方法有2种,一是及时处理异常;二是声明该方法可能抛出该异常。(作用:告诉方法的访问和调用者,该方法可能出现哪些异常,并将异常交给访问和调用者处理。类似告知药品的副作用说明。)
语法:方法名后跟throws关键字。多个异常用逗号隔开。
public void getTo() throws IOException,NullpotintExcetion{}
方法没处理的运行时异常,必须声明;方法中没处理的非运行时异常,可以声明,也可以不声明。
子类的重写父类的方法时,不能抛出父类中没有的异常,只能少或没有。
4.自定义异常:
自定义异常一般继承Exception(继承它,则是非运行时异常)或它的子类RuntimeException(运行时异常)
自定义异常:可以手动抛出、可以声明、可以捕获
5.输出异常信息:
Throwable定义了3个属性用来存储异常信息:
message String类型 异常详细的秒速文本信息
StackTrace StackTrackElement[]类型 异常的所有方法调用记录
cause Throwable类型 产生异常的原因
三.断言
命令 java -ea开启断言
命令 java -da关闭断言
断言语法:
在要调试的代码上方编写
assert 表达式;
或 assert 表达式1:表达式2;//表达式1为false 时,以表达式2的值为参数构造AssertionError对象,并抛出。