本帖最后由 sun2ice 于 2018-1-4 17:32 编辑
#day08异常
##异常概述异常的体系结构
* 异常:不正常,我们写代码的时候出现的编译或者运行时的错误
* 异常体系
* Thowable(顶层)
* Error:不应该试图捕获的严重问题,不能够处理的异常
* Exception:可以处理的异常 #编译时异常
* RuntimeException #运行时异常
##异常处理
* JVM处理
* 把异常的类型,原因还有位置显示在命令行 并终止程序,异常后面的代码不执行
* 捕获处理
* try...catch语句格式
```
try{
有可能出现问题的代码
}catch(异常类型 变量名){
处理异常
}
try...catch 的执行顺序:首先执行try语句
有异常,异常代码那一行下面的代码不在执行,,直接到catch语句中,继续执行catch后面的代码
没有异常,跳过catch语句,执行后面的代码
```
* 多个try...catch语句try...catch...catch
```
使用try-catch捕获多个异常:
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
注意:
1):一个catch语句,只能捕获一种类型的异常,如果需要捕获多种异常,就得使用多个catch语句.
2):代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能同时出现多个异常.
多个catch之间的顺序
可以有子父类关系 父类放在子类后面
平级之间没有顺序
```
* JDK1.7后
* `catch(异常1 | 异常2 异常变量名){ }`
* 抛出异常
```
* throw: 运用于方法内部,用于给调用者返回一个异常对象,和return一样会结束当前方法.
throw语句:
运用于方法内部,抛出一个具体的异常对象.
throw new 异常类("异常信息"); 终止方法.
throw:
一般的,当一个方法出现不正常的情况的时候,我们不知道该方法应该返回什么,此时就返回一个错误,在catch语句块中继续向上抛出异常.
return 是返回一个值,throw 是返回一个错误,返回给该方法的调用者.
```
```
* throws: 运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
如果每一个方法都放弃处理异常都直接通过throws声明抛出,最后异常会抛到main方法,如果此时main方法不处理,继续抛出给JVM,底层的处理机制就是打印异常的跟踪栈信息.
```
##Throwable常用方法
```
1):String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因).
2):String toString():获取异常的类型和异常描述信息(不用).
3):void printStackTrace():打印异常的跟踪栈信息并输出到控制台. 不需要使用System.out.println.包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace.
记住:现在在catch语句块中,必须写:e.printStackTrace();目的:查看异常的具体信息,方便调试和修改.
```
##finally的使用
* 组合trycatch使用,用于释放资源等收尾工作,无论try...catch语句如何执行执行,finally的代码一定会执行
```
try{
可能出现的问题
}catch(异常对象){
处理异常
}finally{
释放资源
清理垃圾
}
```
##异常的分类
* 运行时期异常
* 继承RuntimeException
* 编译期间可处理可不处理
* 编译时期异常
* 继承Exception的子类 非RuntimeException 得子类
* 编译期间必须处理
##自定义异常类
* 什么是自定义异常类:
* 在开发中根据自己业务的异常情况来定义异常类.
* 异常类如何定义:
* 方式1):自定义一个受检查的异常类: 自定义类 并继承于`java.lang.Exception.`
* 方式2):自定义一个运行时期的异常类:自定义类 并继承于`java.lang.RuntimeException.`
##递归
* 原理 将打的问题拆分为小问题,将小问题在拆分更小的问题,放过来解决
* 在方法本身不断的调用方法自己
* 注意事项
* 递归一定要有出口,内存溢出
* 递归次数不宜过多,内存溢出
* 递归可以用循环实现 反之不一定
|
|