异常 Exception
为什么需要学习异常?**
- 在开发中,程序员会开发过程中,会遇到异常bug,JVM会终止程序,带来用户体验不好。在实际项目开发中,在整个项目过程中,遇到报错,整个服务器会中断,带来的问题一方面是不利于项目的完整性,带来用户体验不好
- 学习异常,才能够帮助开发者能够更好的解决程序中遇到的问题,不仅如此,哪怕就算是程序出错了,也 希望能够程序正常运行下去,并且能够告诉我们程序哪里出错了,把错误信息告诉开发者
生活中异常:
小明来学校上课,赶到学校上课,不会迟到
在来上课的路上,遇到一些问题
下雨了,带伞
遇到小小的事故,其他的阻塞交通事故
忘记带电脑
地震等等。
程序中异常:
- Java是面向对象语言,对异常也提供一系列的异常对象
- 常见的异常:除数不能为零,数组下标越界异常,类型转换异常,空指针
异常体系结构图/异常分类
Throwable 异常的最大父类
Error 严重错误:如内存溢出等,程序员无法解决的,不做处理
Exception:程序员能够处理的
Exception 如果是Exception下面的子类,都是属于 编译时异常,编写程序的时候,就直接报错了
RuntimeException 如果是RuntimeException下面的子类,都是属于 运行时异常,在运行程序的时候,遇到的错误,就叫运行时异常
处理异常有两种方法:
1.try-catch 手动处理异常
2.throws 抛给别人去处理
使用异常机制:try-catch解决异常问题
-
语法格式
try{
有可能会出现异常的代码块
}catch(异常类名 名称){
出错了,匹配异常对象
异常处理的信息
} -
执行流程:
1、System.out.println(String.format("%d / %d = %d",num1,num2,num1/num2));
2、ArithmeticException ae = new ArithmeticException();
3、Exception e = ae; 多态
4、进到catch进行匹配异常,
分为两种情况:
匹配成功:异常处理成功了,后面的程序得到正常运行不会受影响
匹配不成功:匹配失败,就相当于没有得到正确的异常处理,后面的程序不会得到正常运行会受影响
1.try块里面的代码出错了,进到catch进行匹配
1.1如果匹配成功,异常得到正常的处理
1.2如果匹配失败,异常没有正常的处理
2.try块里面的代码没有出错,继续执行try块后面的代码
使用异常机制:try-catch-finally解决异常问题
-
语法:
-
try{
放可能会出现异常的代码
} catch (Exception e) {
e.printStackTrace();
异常匹配处理
} finally {
最终一定会执行的代码块
一般finally块就做关闭资源的操作:
关闭数据库资源
关闭IO流资源
}- finally关键字:不管try块有没有发生异常,最终一定都会执行的代码块, 唯一不执行finally块的情况,使用系统退出的方法
return关键字在异常处理的时候,在try块或者是catch遇到return,不会影响finally的执行,返回值或者是退出方法
* 执行流程:
加入return关键字
首先在try块如果发生异常
进到catch进行捕获异常
匹配成功,打印异常信息
遇到return
再执行finally块
执行finally块,之后再return退出整个方法
- finally关键字:不管try块有没有发生异常,最终一定都会执行的代码块, 唯一不执行finally块的情况,使用系统退出的方法
-
面试题:
final 和 finally 和 finalize 的区别:
final 代表最终的,不能被修改的,修饰属性和方法和类
finally 代表try-catch-finally异常里面最终一定会执行的代码块,一般用于关闭资源
finalize 是系统使用的方法,代表是访问了内存中不存在的空对象,系统会调用垃圾回收的方法,是Object的方法