什么是异常?
程序运行过程中出现的非正常的情况既是异常.
异常的分类:
Throwable:
Java语言中错误或是异常的父类,位于 java.lang包中
(1) 常见的构造方法:
a. Throwable():无参数的构造方法
b. Throwable(String message):带有字符串异常信息的有参数构造方法
(2) 常见的功能方法:
a. String getMessage():获取字符串类型的异常信息
b. void printStackTrace():打印输出调用过程中产生的栈详细信息
Error:
Error是Throwable的子类,代表错误
(1) 特点:Error通常紧靠程序本身无法恢复的严重错误.
例如:jvm内存不足或是方法调用过程出现了栈溢出
java.lang.StackOverflowError(栈溢出)
(2) 处理态度:程序中一旦出现Error的结果,通常无法利用程序本身进行恢复
Exception:
Exceptio是Throwable的子类,代表异常.
(1) RuntimeException:运行时异常、 未检查异常
a. 概念:直接或是间接继承RuntimeException的异常称为运行时异 常(RuntimeException本身和其子类)
b. 特点:编译器在编译过程不检测此类异常,编译通过,运行过程中报错
c. 处理态度:运行时一般可以避免, 此类异常可以处理也可以不处理,不处理可以通过严谨代码进行避免
(2) 非RuntimeException:非运行时异常、已检查异常
a. 概念:和RuntimeException没有任何继承关系的异常称为非运行时异常
b. 特点:编译器在编译过程检测此类异常,编译报错
常见异常 | 异常翻译 |
---|---|
ArrayIndexOutOfBoundsException | 数组下标越界 |
StringIndexOutOfBoundsException | 字符串下标越界 |
IndexOutOfBoundsException | 下标越界 |
NullPointerException | 空指针异常 |
ClassCastException | 类型转换异常 |
异常的产生原因:
自动产生异常:
(1) 产生原因:程序运行过程中,遇到错误代码,自动产生异常
(2) 结果:程序中一旦出现异常,程序不能继续执行之后的代码, 则程序会被终止
(3) 例如:空指针异常、类型转换异常等异常可能都会在运行过程中自动产生
手动产生异常:
(1) 关键字:throw
(2) 语法:throw new 异常类名("异常 信息");
(3) 位置:定义在方法内部
(4) 结果:作用效果类似于于return语句,终止当前函数、方法
异常的处理:
消极处理异常:
(1) 关键字:throws
(2) 位置:在方法的声明处
(3) 语法:
修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类名2{
// 方法实现部分
}
(4) 结果:消极处理异常只是推卸责任,最终将异常抛给jvm,导致程序因异常而被终止
(5) 意义:非运行时异常虽然没有解决问 题,但是可以让非运行时编译通过
(6) 注意:利用父类型异常处理子类型的异常,体现多态
积极处理异常:
(1) 关键字:try...catch
(2) 位置:只能定义在方法内部
(3) 语法: try{
// 可能出现异常的语句
}catch(异常类名 e){
// 异常出现执行的语句
}
(4) 注意:只有当try中出现异常时,才执行对应的catch中代码
(5) try...catch结构的细节:
a. 一个try后面可以跟多个catch,从上往下依次进行匹配,直到匹配成功
b. 利用多态技术,通过父类型的catch处理子类型的异常;
而且如果既有父类型的catch也有子类型的catch;
则必须将定义子类型的catch放于其父类的前面
(6) finally的应用:
a. 语法:try{
// 可能出现异常的语句
}catch(异常类名 e){
// 异常出现时执行的代码
}finally{
// 不管有没有异常都必须执行
}
b. 注意:实际开发时,通常不会将return定义在finally,finally中通常用于关闭资源