文章目录
- 一、异常概述及体系结构
- 分类
- Error
- Exception
- 异常的体系结构
- 异常处理:抓抛模型
- 异常处理机制一:try-catch-finally
- finally的使用
- 异常处理机制一:throws+异常类型
- 如何选择两种方式
- 手动生成异常对象
- 如何定义自定义的异常类
一、异常概述及体系结构
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
分类
Error
Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。
(基本上可以通过报错提示后面的后缀Error来判断)
Exception
其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
异常的体系结构
java.lang.Throwable包括
①java.lang.Error:一般不进行针对性代码处理
②java.lang.Exception:可以进行异常的处理,又分为:
编译时异常(checked):IoException(FileNotFoundException等)、ClassNotFoundException
运行时异常(unchecked):NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、NumberFormatException、InputMisMatchException、ArithmeticException等
异常处理:抓抛模型
过程一:“抛”
程序在正常执行过程中,一旦出现异常,就会在异常代码处生成一个异常类的对象(每个异常都定义为一个类),并将对象抛出。一旦对象抛出,就不再执行其后的代码。
过程二:”抓“
可以理解为异常处理方式。分为两种:
try-catch-finally
throws
异常处理机制一:try-catch-finally
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}catch(异常类型3 变量名3){
//处理异常的方式3
}
……
finally{
//一定会执行的代码
}
说明:
1、finally是可选的
2、try将可能出现异常的代码包起来,在执行过程中,一旦出现异常,就会生成一个对应一场类的对象,根据此异常的类型,去catch进行匹配
3、一旦try中的异常类对象匹配到某一个catch时,就进入catch中进行异常处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况下),继续执行其后的代码
4、catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下,无所谓;catch中的异常类型如果有子父类关系,则要求子类一定声明在父类上面,否则报错
5、常用的异常对象处理方式:
String类型返回值的getMessage(),返回的是异常信息
printStackTrace,打印堆栈信息
6、在try结构中声明的变量,在出了try结构后,不能被调用
使用try-catch-finally结构处理的是编译时异常,运行时仍可能报错。相当于将编译时出现的异常,延迟到运行时。
开发中,由于运行时异常比较常见,通常我们不对运行时异常编写try-catch-finally结构
try结构自动补全:整个选中后——右键——surround with——try catch block
7、可以嵌套
finally的使用
1、finally中声明的是一定会被执行的代码。即使 catch中又出现异常、try中有return语句、catch中有return语句等情况。
2、像数据库连接,输入输出流,网络编程Socket资源,JVM是不能自动回收的,需要我们手动进行释放。释放的语句就应该写在finally中。
异常处理机制一:throws+异常类型
1、throws+异常类型 声明在方法的声明处。指明方法执行时可能会抛出的异常类型。一旦方法体执行时出现异常,会在异常代码处生成一个异常类的对象,此对象满足throws后的异常类型时,会被抛出。异常代码后的代码不会执行
2、try-catch-finally结构真正将异常处理掉了
throws只是将异常抛给方法的调用者,并没有真正处理
如何选择两种方式
1、如果父类中被重写的方法没有throws方式处理异常,则子类中也不能用throws处理。如果子类中有异常,需要使用try-catch-finally处理
2、执行的方法a中,如果有调用了几个其他的方法,且这几个方法有递进关系,建议使用throws进行异常处理,在方法a中可以使用try-catch-finally处理
手动生成异常对象
一般生成的对象会选择RunTimeException或Exception,因为Exception是包括编译异常的,所以如果创建的是Exception的异常对象,编译时会出错,还需要进行异常处理(throw或try-catch-finally)
如何定义自定义的异常类
1、继承与现有的异常结构:RunTimeException或Exception
2、提供一个全局常量:serialVersionUID
3、提供重载的构造器