7.1异常概述和异常体系结构
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中任然会遇到一些问题,因为很多问题不是靠代码就能避免的,比如:客户端输入数据的格式,读取文件是否存在,网格是否始终保持通畅等等。
- 异常:在Java语言中,讲程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
- Java程序在执行过程中所发生的异常事件可以分为两类:
> Error:Java虚拟机无法解决的严重问题,如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。
> Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如
1.空指针访问;
2.试图读取不存在的文件;
3.网络连接中断;
4.数组角标越界; - Exception分类:编译时异常(受检异常)、运行时异常(非受检异常);
7.2常见的异常
面试题:常见的异常都有哪些?举例说明
- NullPointerException(空指针异常)
- IndexOutofBoundsException(角标越界)
- ClassCastException(类型转换异常)
7.3异常处理方式一
Java异常处理的方式:
方式一:try-catch-finally
方式二:throws+异常类型
一.异常的处理:抓抛模型
过程一:“抛”:程序在正在执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。
关于异常 的产生:
①系统自动生成的异常对象;
②手动的生成一个异常对象,并抛出(throw)
过程二:“抓”:可以理解为异常的处理方式:①try-catch-finally ②throws
二.try-catch-finally的使用
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式1
}catch(异常类型3 变量名3){
//处理异常的方式1
}
......
finally{
//一定会执行的代码
}
举例:
public void test() {
int[] arr=null;
try{
System.out.println(arr[3]);
}catch(NullPointerException e) {
System.out.println("出现了空指针异常!");
}
- 常用的异常对象处理方式:(catch中)
catch(Exception e) {
System.out.println(e.getMessage());
}
catch(Exception e) {
e.printStackTrace();
}
三.finally的使用
说明:
1.finally是可选的。
2.finally中声明的是一定会被执行的代码,即使catch中又出现异常了、try中有return语句、catch中有return语句等情况。
3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。
4.try-catch-finally结构可以相互嵌套。
四.体会
体会1:使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现;
体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,我们说一定要考虑异常的处理。
7.4异常处理方式二
- throws+异常类型
1.“throws+异常类型“写在方法的声明处,指明此方法执行时,可能会抛出的异常类型。
2.体会:try-catch-finally:真正的将异常处理掉了;
throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。
方法重写的规则之一:子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
7.5手动抛出异常:throw
7.6用户自定义异常类
public class MyException extends RuntimeException {
static final long serialVersionUID = -7034897190895666939L;
public MyException() {
}
public MyException(String msg) {
super(msg);
}
}