1 异常分类
1.1 基本异常
阻止当前方法或作用域的情况。
异常不一定是错误,需要区分其与Error的差异。
(1)抛出异常:throw
throws
throw new ExceptionClassName(Type args);
异常对象的根类型为Throwable
(2)重新抛出异常:
catch(Exception e){
throw e;
}
重抛异常会将异常抛给上一级环境的异常处理程序,同一个try块后面的catch会被忽略,异常信息全部保存。
(3)异常链
捕获异常后,抛出另一个异常,并希望将原始异常信息保存,这被称为异常链。
使用Throwable的带有cause的子类实现异常链。有三个子类实现了cause:Error、Exception和RuntimeException。调用cause使用initCause()。
1.2 自定义异常
package com.example.springbootmybatis;
/**
* 自定义异常类
* 用户不存在异常信息类
*/
public class UserNotExistsException extends RuntimeException{
public UserNotExistsException() {
super();
}
public UserNotExistsException(String message) {
super(message);
}
}
public class Test{
public void f() throw UserNotExistsException{
System.out.println("Throw UserNotExistsException from f()");
throw new UserNotExistsException;
}
public static void main(String[] args){
try{
f();
}catch(UserNotExistsException e){
System.out.println("Caught it!");
}
}
}
1.3 Java标准异常
Java中任何异常都可以被Throwable表示。Throwable可以被两种子类表示:Error和Exception。Error是编译和系统错误,Exception是可以被抛出的异常。
2 捕获异常方法
2.1 基本异常方法
监控区域:一段可能产生异常的代码,后面跟着处理异常的代码。
如果在方法内部抛出了异常,该方法将在抛出异常过程中结束。
如果不希望就此结束,可以在方法内设置一个特殊的块来捕获异常,即try块。
try{
}
2.2 捕获所有异常
catch(Exception e);
建议将这个捕获程序写在最后,免得抢在其他捕获程序之前把异常捕获了。
Exception是所有异常的基类。可以通过调用它的基类Throwable的方法获取详细信息。
String Exception.getMessage();//获取异常详细信息
String Exception.getLocalizedMessage();//获取异常详细信息
String Throwable.toString();//返回Throwable的简单描述
void Throwable.printStackTrace();//打印Throwable及其调用栈轨迹,输出到标准错误
void Throwable.printStackTrace(PrintStream);//打印Throwable及其调用栈轨迹,输出到打印流
void Throwable.printStackTrace(java.io.PrintWriter);//打印Throwable及其调用栈轨迹,输出到打印文件
void Throwable.fillInStackTrace();//用于在Throwable对象的内部记录栈帧的当前状态
3 异常处理方法
3.1 catch
跟在try块之后的异常处理程序。
try{
}catch(Type1 id1){
}catch(Type2 id2){
}catch(Type3 id3){
}
每一个id都是一个不同异常类型的对象
3.1.1 异常处理模型
(1)终止模型
假设错误非常关键,一旦发生,程序无法返回异常发生的地方,一旦异常被抛出,错误无法挽回,也不能回来继续执行。
(2)恢复模型
异常处理程序的工作是修正错误,重新尝试调用出问题的方法,并认为第二次能够成功。整个模型期望于异常处理程序处理之后能够继续执行原来的程序流程。
3.1.2 模型实现方法
- 遇见错误不抛出异常,调用方法来修正错误
- 把try块放入while循环中,不断进入try块直至得到满意的结果。
3.1.3 异常与记录日志
java.util.logging
3.2 finally
若(1)希望不管try块是否抛出异常,都能得到执行;(2)即使return返回了也会执行;(3)异常丢失也会执行finally子句。可以添加finally子句在catch后。try{
}catch(Type1 id1){
}catch(Type2 id2){
}catch(Type3 id3){
}finally{
}
4 异常说明
方法说明的一部分,用于将方法中可能抛出的异常提供给程序库的使用者。void f() throws AException, BException, ...{
}
不同类型的异常
5 异常限制
子类覆盖父类方法时,对异常说明不影响,依然起作用。