异常体系:
- |——Throwable (实现类描述java的错误和异常)
- |——Error (错误)
- |——Exceprion (异常)
- |——RuntimeException (运行时异常)
- |——非运行时异常(编译时异常/受检异常)
Throwable常用方法
- toString() 返回当前异常对象的完整类名
- getMessage() 返回的是当前创建Throwable传入的字符串信息
- printStackTrace() 打印异常的栈信息
捕获e.printStackTrace()的具体内容
try {
} catch (SftpException e)
e.printStackTrace();
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
log.info(" 错误原因:" + sw.toString());
}
Error (错误):一般是jvm或硬件引发的问题,一般不通过代码去处理。
Exceprion (异常):需要通过代码去处理
RuntimeException (运行时异常):如果一个方法内部抛出了一个运行时异常,方法上可以声明也可以不声明,调用者可以处理也可以不处理(运行时异常都是可以通过良好的编程习惯避免的,所以没有严格要求处理)
编译时异常:如果一个方法内部抛出了一个编译时异常对象,那么方法上必须要声明,调用者也必须要处理
异常的处理:
1.捕获处理:
try {
可能发生异常的代码
} catch ( 捕获的异常类型 变量名 ) {
处理异常的代码
}
注意细节:
- try块代码出现异常,经过处理后,try-catch块外面的代码可以正常执行
- try块中,异常代码之后的代码不会执行
- 一个try块后面可以跟多个catch块
- 一个try块可以捕获多种异常类型,但是捕获的异常类型必须从小到大捕获,否则编译报错
2.抛出处理:
方法定义 throws Exception1, Exception2,···,··· {
//声明异常,throws 后跟异常类,可以一次声明多种类型的异常,通知方法调用者
throw new Exception1("抛出异常"); // throw关键字后面接受的是具体的异常的对象
}
注意细节:
- 如果一个方法内部抛出了一个异常,那么必须在方法上声明抛出
- 如果调用了一个声明抛出的方法,那么调用者必须要处理异常
- 如果一个方法内部抛出了一个异常对象,那么throw语句后面代码都不会执行了(一个方法遇到了throw关键字,方法会马上停止执行)
- 在一种情况下,只能抛出一种类型异常对象
3.自定义异常:
自定义一个类继承Exception即可
finally块
使用前提:必须存在try块才能使用
finally是在return语句执行之后,返回之前执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值)
finally块代码在任何情况下都会执行,除了jvm退出的情况【不管有木有出现异常,finally块中代码都会执行;当try和catch中有return时,finally仍然会执行】
适合做资源释放的工作,可以保证资源文件在任何情况下都被释放。