异常 : 指的是在程序运行的过程中,出现非正常的情况导致程序终止
注意:异常不是指的语法错误或逻辑代码错误
JVM(系统)是如何处理异常的
Java中把不同的异常用不同的类表示。一旦发生某种异常。系统就会创建对应异常类的对象并抛出。
该异常是可以被catch到如果catch到后可以做相应的处理。如果没有catch动作程序终止运行。
异常体系结构:
|------Throwable
|-------Error: 表示严重错误。无法catch只能程序挂掉。
|-------Exception :表示普通异常是可以被catch到的。catch到后可以做相应的处理程序不会挂掉。没有catch到程序一样终止运行。
|------编译时异常(受检异常):在程序编译的时候发生的异常-不一定会真正的发生异常只是有可能会发生异常
例:有一个程序该程序需要读取配置文件,但该配置文件有可能找不到不是说一定找不到。
那这个读取文件的操作(方法)就会在编译时发生异常-所以需要处理该异常-万一找不到了怎么办。
|------运行时异常(非受检异常)(RuntimeException及子类):在程序运行的时候发生的异常。
这类异常是由程序员的代码编写错误导致(比如:空指针 下角标越界 类型转换异常)
我们提到的异常指的是Exception
处理异常:
方式一 :try-catch-finally
方式二 :throws
处理异常方式一:try-catch-finally
格式:
try{
可能会发生异常的代码
代码1
代码2 --> 发生异常。代码3就不再执行了
代码3
}catch(异常类型1){
异常类型1的处理
}catch(异常类型2){
异常类型2的处理
}
.......
finally{
一定要执行的代码
}
说明:
1.如果try中的代码没有发生异常 那么会执行完try中所有的代码后跳到finally中执行finally中的代码。
然后跳出try-catch-finally结果继续向下执行其它代码
2.如果try中的代码发生了异常 那么在try中发生异常的代码后面的try中代码不再执行。
系统会根据相应的异常创建异常类的对象并抛出。因为我们会catch异常所以会和catch后面的异常类型匹配。
如果和第一个catch后面的异常类型匹配失败继承向下匹配直到匹配成功并执行相应catch中的代码执行完后
跳到finally中并执行finally中的代码执行完后跳出try-catch-finally并继续向下执行其它代码。
如果向下匹配失败那么会进入finally中执行finally中的代码然后终止程序的运行(因为没抓到异常-没有匹配成功)。
3.注意:finally可以省略不写 ,如果有finally无论什么情况finally中的代码一定会执行。
异常的API :
getMessage() : 获取异常信息 -- 将异常信息写到日志文件
printStackTrace() : 将异常信息打印到控制台
异常的类型写父类还是具体的类型呢?
场景1(异常类型写父类) : 无论什么异常全部是统一处理方式
场景2(异常类型要写具体的类型 最后用父类兜底) :不同的异常不同的处理方法
注意:如果要匹配多种异常类型 小的(异常的子类)在前面大的(异常的父类)在后面。
try-catch : 有异常要处理 没有一定要执行的代码
try-catch-finally : 有异常要处理 而且有一定要执行的代码(比如 ①关闭资源 ②保存某些数据 ③保存某些状态)
try-finally : 有异常不处理 有一定要执行的代码(比如 ①关闭资源 ②保存某些数据 ③保存某些状态
在jdk1.7的时候 catch中的写法可以这么写 :catch(异常的类型 | 异常的类型2 e)
finally : finally中的代码一定会执行(除非System.exit(0) 关闭JVM).
1.就算在try-catch中有return finally中的代码也一定要执行
2.如果finally中出现return那么try-catch中的return就失效了 -- (其实发生覆盖)