异常处理
异常入门
try-catch
增加健壮性
快捷键ctrl+alt+t
如果进行了异常处理,即使出现了异常,程序可以继续执行
e.getMessage()
看着会舒服很多
程序不正常的情况,逻辑错误不是
两类异常
- error, OOM, 栈溢出
- exception, 可以针对性处理
- 运行时异常,运行过程中的异常
- 编译时异常,编译器检查出的异常
异常体系图
小结
- 异常分两类,运行异常和编译时异常
- 运行时异常是逻辑错误,编译器检查不出来
- 编译时异常是必须要处理的异常
常见运行时异常
NumberFormatException
字符串转数值类型时, 如果不能转换成适当形式, 抛出异常NullPointerException
需要对象的地方使用null
时报错ArithmeticException
ArrayIndexOutOfBoundsException
数组越界ClassCastException
类转型异常
编译异常
了解就行
SQLException
数据库异常IOException
没找到文件
异常处理方式
try-catch-finally
没有finally语法也可以通过
如果异常发生, 则异常后面不会执行,直接进入catch
finally 释放资源
可以有多个catch, 要求父类异常在后, 子类异常在前, 只匹配一个catch
throws
- 可以进行try-finally 配合使用, 直接做善后工作, 执行一段代码, 不管是否发生异常, 都必须执行某个业务逻辑.
总结
- 如果没有异常,执行try中所有语句,不执行catch, 最后要执行finally
- 如果出现异常, 则try块中异常发生后, try块剩下的语句不再执行, 将执行catch块中的语句, 如果有finally,最后还要执行finally中的语句.
如果用户输入的不是整数, 反复提醒输入整数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
try {
String next = scanner.next();
int i = Integer.parseInt(next);
System.out.println("输入的整数是 " + i);
break;
} catch (Exception e) {
System.out.println("继续输入");
}
}
}
throws异常处理
- 如果一个方法可能生成异常, 但不知道怎么处理, 应该显式声明自己处理不了, 调用者负责处理
- 在方法声明中使用throws可以抛出异常列表(多个异常), throws后面的异常类型可以是方法中产生的异常类型.
注意事项和细节
- 编译异常必须处理
- 运行异常, 没有处理, 默认是throws
- 子类重写父类方法时, 对抛出的规定. 子类重写时, 抛出的要么和父类一样, 要么时父类异常类型的子类型.
- throws和try-catch二选一
自定义异常
出现错误, 但是错误并没在异常体系中出现, 可以自定义异常
- 定义类, 继承Exception或者RuntimeException
- 如果继承Exception, 属于编译异常
- 如果继承RuntimeException, 属于运行异常(一般来说, 继承RuntimeException)
throw new AgeException("年龄需要在 18-120 之间"); // 可以通过构造器自定义信息
一般自定义异常, 继承RuntimeException, 也就是做成运行时异常, 我们可以使用默认的处理机制.
throw 和 throws 的区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
默认args数组中的全都是字符串
小结
- 异常捕获的提出, 产生异常和错误, 程序会变得脆弱.
- 异常体系图
- 运行异常(很有可能是逻辑错误)
- 编译异常
- 常见的运行异常
- 常见的编译异常
- 异常处理方式
try {
} catch () {
} finally {
}
throws, 默认方法, 向上
- 自定义异常, 继承RuntimeException
- throw和throws的区别