异常
基本概念
- 什么是异常
程序运行过程中出现的非正常的情况 - 异常如何处理
当异常出现时,执行预先准备好的程序 - 异常处理必要性
减少用户的损失、同时也减少给用户带来的不必要的麻烦;也可以利用异常处理给与用户一些提示
异常的分类
Throwable
Throwable是Java语言中的异常或错误的父类,位于 java.lang 包中
- Throwable的构造方法
- Throwable() :无参数的构造方法
- Throwable(String message):带有异常信息的构造方法
- 成员方法:
- String getMessage():获取字符串类型异常信息
- void printStackTrace():打印输出方法调用过程中产生的 栈详细异常信息
Error
Error是Throwable的子类,代表错误
Error通常是仅靠程序本身无法恢复的严重错误,例如:JVM内存不足或是方法调用过程中栈溢出 (java.lang.StackOverflowError栈溢出)、 (OutOfMemoryError堆溢出)
Exception
Exception是Throwable的子类,代表异常,Exception可非为运行时异常(RuntimeException)和非运行时异常(CheckedException)
RuntimeException
运行时异常、未检查异常,和RuntimeException有直接或间接继承关系的异常类称为运行时异常
- 特点
编译器不检测此类异常,编译通过,但是运行报错 - 处理
运行时异常可处理也可以不处理,此类通过严谨代码 可以避免 - 常见的运行时异常
- ArrayIndexOutOfBoundsException( 数组下标越界)
- StringIndexOutOfBoundsException( 字符串下标越界)
- IndexOutOfBoundsException( 集合中下标越界)
- java.lang.NullPointerException(空指针异常)
- java.lang.ClassCastException(类型转换异常)
- java.lang.NumberFormatException(数字格式转换异常)
CheckedException
非运行时异常、已检查异常,和 RuntimeException没有任何继承关系的异常类称为非运行时异常
- 特点
编译器检测此类异常,编译报错 - 处理
非运行时异常一旦出现,必须处理 - 举例
Class.forName(“Student”);// 区分于语法错误
异常产生的原因
自动产生异常
- 产生原因
程序运行过程中,遇到错误的代码,自动产生异常 - 结果
程序中一旦出现异常,程序不能继续执行之后的代码,则程序被终止掉
手动产生异常
- 关键字
throw - 语法
throw new 异常类名(“异常信息”); - 位置
定义在方法内部 - 结果
作用效果类似于 return语句,终止当前方法、函数;程序运行时因异常而被终止掉
异常的传递
Java中的异常沿着方法的调用链进行反方向进行传递,最终传递给JVM
异常的处理
消极处理异常(声明异常)
- 关键字
throws - 位置
在方法声明处 - 语法
修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{
// 方法的实现部分
}
- 消极处理异常时,可以利用其父类型的异常进行处理
- 结果
消极处理异常只是推卸责任,最终将责任推卸给JVM,程序最终还是因异常而被终止 - 作用
消极处理异常可以让非运行时异常在编译时通过
积极处理异常
- 语法
try{
// 可能出现异常的语句
}catch(异常类名 e){
// 异常出现执行的语句
}
- try…catch常用语法
- try…catch结构,一旦异常出现try…catch 才起作用
- try后面可以跟多个 catch结构,一旦try中出现异常,则从 上往下依次进行匹配catch,直到匹配成功
- catch中可以利用父类型捕获:本类+所有的子类型的异 常,体现多态
- 子类型 的 catch 需要定义在 父类型的 catch前面
- catch中 只能定义 try中可能出现的非运行时异常; catch中 可以定义任意的 运行时异常,即使try中不可能出现 此类运行时异常
finally
finally表示必须执行的语句
- 语法
try{
// 可能出现异常的语句
}catch(异常类名 e){
// 异常出现时,执行的语句
}finally{
// 不管有没有异常,必须执行的语句 }
开发时,通常不要将return定义在finally中,finally通常用于关闭资源,例如IO流等
常见的结构小结
- try{}catch(){}
- try{}catch(){}catch(){}
- try{}catch(){}finally{}
- try{}catch(){}catch(){}finally{}
以下结构遇到认识:
-
try{}finally{} 这种做法目的是保证某些代码放在finally中必须执行
-
try{ try{}catch(){} }catch(){}
-
try{}catch(){ try{}catch(){} }
-
try{}catch(){}finally{ try{}catch(){} }
finally要么和try一起,要么try…catch一起,但是不 能单独使用
-
final、finalize、finally的区别
- final:修饰符,可以用于修饰变量、方法、类
final修饰的变量作用范围内的常量,允许一次赋值,不允许修改
final修饰方法允许子类继承使用,但是不允许子类覆盖final修饰的类;不允许子类继承,即没有子类 - finalize:方法名,此方法是Object类中的,在垃圾回收器回 收垃圾对
象,jvm自动调用的方法 - finally:积极处理异常时结构内容,必须执行的语句定义finally中
- final:修饰符,可以用于修饰变量、方法、类
-
常用的结构
- try{}catch(){}finally{}
- try{}finally{}
自定义异常
- 一个类继承Exception或是其子类,如果定义的类继承了RuntimeException或是RuntimeException的子类,则此异常为运行时异常;如果此类和RuntimeException 没有任何继承关系,则异常类为非运行时异常
- 提供两个构造方法
a. 无参数的构造方法
b. 有参数的构造方法,参数类型为String ,接收异常信息利用super(message); 设置异常信息
整理不易,喜欢请点个赞!
编者微信:1014961803,添加时请备注"CSDN"