概述
顶级父类:Throwable
1、错误:Error
需要重写代码,工程师无法解决,只能尽量避免,如堆栈溢出错误,好比是绝症。
2、异常:Exception
异常是可以处理的,好比是感冒,工程师可以解决。
- 分类
- 编译时期异常
编译器会直接把代码标红 - 运行时期异常:RuntimeException
编译器不会直接报出,只有在运行的时候才会被捕捉到
3、创建异常
throw new 异常对象
4、处理异常
1、throw
抛出异常,将异常抛给调用者不亲自在存在异常的地方进行处理,只要不在线程中可以一直往上抛,直到抛到JVM处,JVM将异常信息打印出来,结束程序。
2、try … catch
- try写的是可能出现异常的代码
- catch写的是捕获异常,处理异常的逻辑
异常对象的常用方法:
String getMessage():获取异常描述信息,原因(提示给用户的时候,就提示错误原因)
String toString():获取异常的类型和异常描述信息(不用)
void printStackTrace():打印异常跟踪栈信息并输出到控制台 --> 常用
- 注意事项:
a. 抛多少异常,就能捕获多少,或者直接捕获父类异常对象
b. 多catch的时候,上面不要先捕获父类异常 - 快捷键 :Ctrl + Alt + T
3、finally
一定会执行的代码,跟随actch使用
两种处理异常的区别
- throws:直接向上抛出,自己不做具体处理,抛给调用者(不要一味着向上抛)
- try catch finally:不交给JVM了,我们自己处理,一般作为统一处理
总结
- 运行时期异常:不用代码处理,证明你写代码有问题,自己去改
- 编译时期异常:一般我们直接throws或者try…catch
5、自定义异常
- 创建一个类,继承Exception:此自定义异常为编译时期异常
- 创建一个类,继承RuntimeException:次异常为运行时异常
- 注意事项:运行时期异常一般不用管,因为不好发现
/**
* 自定义异常
*/
public class RegisterException extends Exception {
public RegisterException() {
}
public RegisterException(String message) {
super(message);
}
}
/*
模拟注册
1.输一个姓名
2.判断输入的姓名是否在集合中
2.1 在集合中抛出异常
2.2 不在集合中,注册成功
*/
public class Test {
public static void main(String[] args) throws RegisterException {
String[] arr = {"涛哥","苍老师","热巴","佟丽娅"};
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
register(arr, name);
System.out.println("注册成功");
}
private static void register(String[] arr, String name) throws RegisterException {
for (int i=0;i<arr.length;i++) {
if(name.equals(arr[i])){
throw new RegisterException("用户已经存在");
}
}
}
}
JDK7新特性
try(定义流对象){
可能出现异常的逻辑代码
}catch(){
捕获异常
}
这样的话,不用现在try…catch代码块之外定义变量,可以使得编码更加简洁和优雅一些。