异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类
java.lang.Throwable
作为所有异常的超类。Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类Error
和Exception
。 ~ 本篇主要记录内容包括:异常介绍、抛出异常、声明异常、捕获异常
- 上一篇内容:Java基础:Java抽象接口
- 下一篇内容:Java集合:概述
- 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中)
文章目录
代码语言:txt复制- [一、异常介绍](https://cloud.tencent.com/developer)
- [1、异常继承体系](https://cloud.tencent.com/developer)
- [2、运行时期异常&编译时异常](https://cloud.tencent.com/developer)
- [3、发生异常到时候,程序的执行特征](https://cloud.tencent.com/developer)
- [4、异常与错误的区别](https://cloud.tencent.com/developer)
- [5、异常在方法重写中细节](https://cloud.tencent.com/developer)
- [二、抛出异常、声明异常](https://cloud.tencent.com/developer)
- [1、抛出异常 throw](https://cloud.tencent.com/developer)
- [2、声明异常 throws](https://cloud.tencent.com/developer)
- [3、自定义异常](https://cloud.tencent.com/developer)
- [4、Throwable类中的常用方法](https://cloud.tencent.com/developer)
- [三、捕获异常](https://cloud.tencent.com/developer)
- [1、try…catch…finally](https://cloud.tencent.com/developer)
- [2、异常处理流程](https://cloud.tencent.com/developer)
- [3、try…catch…finally 异常处理的组合方式](https://cloud.tencent.com/developer)
一、异常介绍
1、异常继承体系
异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable
作为所有异常的超类
- Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类
Error
和Exception
- Error : 错误,程序无法处理的错误,比如
OutOfMemoryError
、ThreadDeath
等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。 - Exception : 异常,程序本身可以处理的异常,程序中应当尽可能去处理这些异常。
RuntimeException
: 运行期异常,JAVA程序运行过程中出现的问题,可以通过java虚拟机来自行处理CheckableException
: 编译时异常或者可检查异常,我们应该捕获或者抛出,try…catch。
2、运行时期异常&编译时异常
- 运行时期异常:方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码;
- 编译时异常: 必须在编译前处理,否则无法通过编译
3、发生异常到时候,程序的执行特征
- 我们的代码,从发生异常的地方,开始被一分为二
- 在异常发生之前的代码,都可以正常运行,之后的代码不会执行
- 当异常发生的时候,这个异常被
jvm
所捕获,并将这个异常的所有相关信息,创建为一个异常对象,然后将该异常对象的信息输出到控制台(执行的是虚拟机默认的异常处理代码) - 终止当前程序
4、异常与错误的区别
- 异常:指程序在编译、运行期间发生了某种异常(
XxxException
),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行。 - 错误:指程序在运行期间发生了某种错误(
XxxError
,Error
错误通常没有具体的处理方式,程序将会结束运行。Error
错误的发生往往都是系统级别的问题,都是jvm
所在系统发生并反馈给jvm
的。我们无法针对处理,只能修正代码。
5、异常在方法重写中细节
- 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明;
- 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集
二、抛出异常、声明异常
1、抛出异常 throw
在 java 中,提供了一个throw关键字,它用来抛出一个指定的(Throwable类型)异常对象,一般会用于程序出现某种逻辑时,程序员主动抛出某种特定类型的异常
使用格式:throw new 异常类名(参数);
具体步骤:
- 创建一个异常对象, 封装一些提示信息(信息可以自己编写).
- 通过关键字
throw
,将这个异常对象告知给调用者. throw
用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行
注意事项:
- 如果抛出的异常对象属于可检查的异常,必须在该方法头部,声明抛出此异常, 即: throws 要抛出的异常类型;
- 其次,对于抛出可检查的异常,还必须与方法的异常列表中的异常兼容;
- 如果父类方法声明了异常列表:子类可以不声明异常列表,子类方法有自己异常列表时,必须保证,子类的异常列表所包含的异常类型,与父类中所包含的异常类型兼容
2、声明异常 throws
将问题标识出来,报告给调用者
throws
是方法可能抛出异常的声明, 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws
关键字进行声明。
对于声明了会抛出可检查异常的方法, 就意味着这个方法会产生可检查异常,所以,一旦调用该方法就必须对该方法做异常处理
在throws
后面可以写多个异常类,用逗号隔开
声明异常格式:修饰符 返回值类型 方法名(参数) throws <异常列表> { }
3、自定义异常
如果Java没有提供你需要的异常,则可以自定义异常类
编译时异常继承Exception
,运行时异常继承RuntimeException
格式:
代码语言:javascript复制Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
4、Throwable类中的常用方法
getCause()
:返回抛出异常的原因,即异常提示信息。如果 cause 不存在或未知,则返回 null;getMessage()
:返回异常的消息信息,即该异常的名称与详细信息字符串;printStackTrace()
:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置
三、捕获异常
1、try…catch…finally
Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
捕获异常格式:
代码语言:javascript复制try {
//需要被检测的语句。
}
catch(异常类 e) { //try中抛出的是什么异常,在括号中就定义什么异常类型。
//异常的处理语句。
}
finally {
//一定会被执行的语句。
}
//try:该代码块中编写可能产生异常的代码。
//catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
//finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
2、异常处理流程
- 首先,当异常在
try*
代码块中发生的时候,虚拟机首先捕获这个异常,创建一个异常对象(包含本次异常的所有详细信息); - 虚拟机会把这个异常,抛出给
catch
代码块(类似于方法调用,虚拟机会调用catch代码块中,处理异常的代码); - 执行
catch
代码块,中的处理异常的代码; - 没有终止我们应用程序,而是从
catch
语句之后的代码开始,继续执行我们的应用程序
3、try…catch…finally 异常处理的组合方式
try catch finally
组合: 检测异常,并传递给catch
处理,并在finally
中进行资源释放;try catch
组合 : 对代码进行异常检测,并对检测的异常传递给catch
处理。对异常进行捕获处理;- 多个
try catch
组合 当可能有多种类型的异常发生的时候,我把可能产生某异常类型的代码分开,分别放在不同的try-catch
代码块中; - 一个
try
多个catch
组合: 对代码进行异常检测,并对检测的异常传递给catch
处理,对每种异常信息进行不同的捕获处理; try finally
组合: 对代码进行异常检测,检测到异常后因为没有catch
,所以一样会被默认jvm
抛出,异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所以finally
只为关闭资源