异常:程序运行过程中出现的意外情况。

(程序运行中可能遇到一些意外情况,可能导致程序中断或奔溃。因此要处理异常,让程序正常稳定运行。)

处理或声明原则:

发生异常的方法 ,可以自行处理异常或把异常返回给方法调用者,告知调用者有问题发生。

因此处理有潜在异常的方法时,有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对象,并抛出。