五、异常
5.1 认识异常
5.1.1 异常的概念
在计算机程序运行的过程中,总是会出现各种各样的错误,如除法运算时除数为0、数组下标越界、数据类型不一致、内存不足、栈溢出等,在Java
中,将程序执行过程中发生的不正常的行为叫做异常.
5.1.2 异常的分类
所有的异常都定义为类
异常中有着不同类型的异常,如下
1. Throwable 类
- java语言中所有错误或异常的父类
2. Error 类
- Java.lang.Error 类包含仅靠程序本身无法恢复的严重错误,一般与JVM相关的问题
- java运行时环境的内部错误或硬件问题
3. Exception 类
-
java.lang.Exception 类 是程序本身可以处理的异常
-
Exception 类主要分为 运行时(RuntimeException)异常 和 检查(Check)异常
-
java常见的 运行时异常
-
异常 说明 ArithmeticException 当出现算术错误时,抛出此异常,例如,在一个整数"除以0"时 ArrayIndexOutOfBoundsException 当非法索引访问数组时,抛出此异常。例如,索引为负或大于等于数组长度 ClassCastException 当试图将对象强制转换为非本对象类型的子类时,抛出此异常 IllegalArgumentException 当向方法传递了一个不合法或不正常的参数时,抛出此异常 InputMismatchException 当欲得到的数据类型与实际输入的类型不匹配时,抛出此异常 NullPointerException 当应用程序试图在需要对象的地方使用null时,抛出此异常 NumberFormatException 当试图将字符串转换成一种数字类型时,但该字符串不能转换为适当格式时,抛出此异常。例如,把 “ABC” 转换成数字
-
5.2 异常处理机制
在程序设计时,必须考虑到可能发生的异常时间并进行处理
5.2.1 异常处理结构
java中针对异常的处理提供了 try、catch、finally、throws、throw
语法 :
try{
//有可能出现异常的语句
}[catch(异常类型 异常对象){
//异常处理句
}] [finally{
//一定会运行到的语句
}]
-
try 语句用于监听,当try语句块内发生异常时,异常就会被抛出,然后停止运行try代码块
-
catch 语句用于捕获异常,catch语句用来捕获try语句中抛出的异常;
-
try 语句抛出的异常类型,与 catch 捕获的异常类型相同时,则会执行catch 代码块
-
finally 语句总会被执行,主要用于回收try语句块内打开的资源,例如关闭数据库等等
-
catch 语句和 finally 语句都可选,但是 catch 和 finally 不能同时消失
-
异常格式常见的组合 :try-catch、try-catch-finally、try-finally 三种
5.2.2 异常对象常用的方法
在catch代码块当中,可以调用异常方法进行输出信息
异常对象常用的方法
方法名 | 说明 |
---|---|
void printStackTrace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串 |
示例
public class Demo01 {
public static void main(String[] args) {
try {
}
//异常类型 Exception
catch (Exception e){
//异常方法
e.printStackTrace();
e.getMessage();
}
}
}
5.2.3 多重 catch 语句
**当我们希望针对不同的异常类型采取不同的处理方式,可以使用 catch **
语法 :
try{
//有可能出现异常的语句
}[catch(异常类型1 异常对象){
//异常处理句
}][catch(异常类型2 异常对象){
//异常处理句
}] [finally{
//一定会运行到的语句
}]
- 如果 try 内的代码出现的异常类型为异常类型1 则执行异常类型1内的代码块
5.2.4 声明异常——throws 关键字
throws 表示该方法可能会抛出此类异常
语法:
public void 方法名() throws 异常类型[,异常类型]{
//方法体
}
-
如果方法体内发生异常,则会抛出该异常
-
在调用方法时则会发生异常
5.2.5 抛出异常——throw 关键字
当需要根据条件判断是否抛出异常时,则可以使用throw 关键字
语法:
throw new 异常名([参数列表])
例如:除数为0时抛出一个异常
public class exception {
//声明一个除法
//throws表示准备抛出一个异常
public void chu(int a,int b) throws Exception{
//除数为0时,抛出一个算术异常
if(b==0){
throw new Exception("除数不能为0");
}else{
System.out.println(a/b);
}
}
}
- throw表示抛出了一个异常
- throws 表示准备抛出一个异常,准备抛出throw抛出的异常
- throw只能抛出 Throwable 类或子类的对象
5.2.6 自定义异常
当 Java 异常体系中提供的异常类型不能满足程序的需要时,可以自定义异常类
自定义异常类的三个步骤
-
定义异常类 继承 Exception 类 或 RuntimeException 类
-
编写异常类的构造方法 ,调用父类的构造方法,常见的有四种形式
//构造方法 1
public Exception(){
super();
}
//构造方法 2
public Exception(String message){
//message是提示语句
super(message);
}
//构造方法 3
public Exception(String message,Throwable cause){
super(message,cause);
}
//构造方法 4
public Exception(Throwable cause){
super(cause);
}
- 实例化自定义异常对象,并使用 throw 关键字抛出。
创建自定义异常
public class exception extends Exception{
public exception(String message){
super(message);
}
}