目录
5.3.1--处理异常的五个关键词(try-catch-finally-throws-throw)
5.3.2--try...catch...finally语句
注意:throws关键字用在方法声明中,用来指明方法可能抛出的多个异常。
通过throw关键字抛出异常后,还需要使用throws关键字或try…catch对异常进行处理。
5.1--什么是异常
//Java中的异常是指Java程序在运行时可能出现的错误或非正常情况.
eg:
在程序中打开一个根本不存在的文件;在程序中除0等.
所有异常类都继承自Java.lang包下的Throwable类。
Trowable类的继承体系如下图所示:
//Error类(错误类):仅靠修改程序本身不能恢复运行;
//Exception(异常类):程序本身可以处理的异常。
Throwable类常用的方法
方法 | 功能 |
---|---|
String get Message() | 返回异常的消息字符串 |
String toString() | 返回异常的简单信息描述 |
Void printStrackTrace() | 获取异常类名和异常信息以及异常出现在程序中的位置,把信息输出到控制台 |
运行结果
5.2--运行时异常&编译时异常
5.2.1--运行时异常
//程序在运行时产生的异常,及时不编写异常处理代码,依旧可以通过编译(unchecked异常)也叫运行时异常
5.2.1.1--常见的运行时异常
5.2.2--编译时异常
//程序在编译时产生的异常,这些异常必须进行处理,否则程序无法正常运行(checked异常)也叫做编译时异常
***在Expection类中,处理RuntimeException类以外,其他子类都是编译时异常
处理编译时异常有两种方式:
(1)使用try...catch语句对异常进行捕获处理。
(2)使用throws关键词声明抛出异常,由调用者对异常进行处理。
5.3--异常的处理方法&语法
5.3.1--处理异常的五个关键词(try-catch-finally-throws-throw)
5.3.2--try...catch...finally语句
//异常捕获try…catch...finally语句的基本语法格式:
try {
// 可能发生异常的语句
} catch(ExceptionType1 e){
// 对捕获的异常进行相应处理
} catch(ExceptionType2 e){
// 对捕获的异常进行相应处理
} finally {
// 无论是否发生异常,此代码块代码总会执行
}
***进入finally代码块的语句,不管程序是否异常,代码都会被执行。因此,通常用finally代码处理必须做的事情。
如果try ... catch执行了System.exit(0).语句,finally语句不执行
//System.exit(0).表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不能执行
异常捕获try…catch...finally语句的处理流程
eg:
源代码
public class Example03 {
public static void main(String[] args) {
//下面的代码定义了一个try…catch…finally语句用于捕获异常
try {
int result = divide(4, 0); //调用divide()方法
System.out.println(result);
} catch (Exception e) { //对捕获到的异常进行处理
System.out.println("捕获的异常信息为:" + e.getMessage());
return; //用于结束当前语句
} finally {
System.out.println("进入finally代码块");
}
System.out.println("程序继续向下…");
}
//下面的方法实现了两个整数相除
public static int divide(int x, int y) {
int result = x / y; //定义一个变量result记录两个数相除的结果
return result; //将结果返回
}
}
运行结果
5.4--抛出异常
5.4.1--throws关键词
throws关键字抛出异常的基本语法格式:
[修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1,异常类2,... {
// 方法体...
}
//throws关键字需要写在方法声明的后面,并在后面需要声明方法中发生异常的类型.
eg:
源代码:
public class Example05 {
public static void main(String[] args) {
//下面的代码定义了一个try…catch语句用于捕获异常
try {
int result = divide(4, 0); //调用divide()方法
System.out.println(result);
} catch (Exception e) { //对捕获到的异常进行处理
e.printStackTrace(); //打印捕获的异常信息
}
}
//下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常
public static int divide(int x, int y) throws Exception {
int result = x / y; //定义一个变量result记录两个数相除的结果
return result; //将结果返回
}
}
运行结果:
注意:当调用者在调用有抛出异常的方法时,除了可以在调用程序中直接进行try…catch异常处理外,也可以根据提示使用throws关键字继续将异常抛出,这样程序也能编译通过。但是,程序发生了异常,终究是需要进行处理的,如果没有被处理,程序就会非正常终止。
5.4.2--throw关键词
//throw关键字用于在方法体内抛出一个异常类对象。基本语法格式如下:
[修饰符] 返回值类型 方法名([参数类型 参数名,...]) throws 抛出的异常类 {
// 方法体...
throw new Exception类或其子类构造方法;
}
注意:throws关键字用在方法声明中,用来指明方法可能抛出的多个异常。
通过throw关键字抛出异常后,还需要使用throws关键字或try…catch对异常进行处理。
eg:
源代码
public class Example07 {
// 定义printAge()输出年龄
public static void printAge(int age) throws Exception {
if(age <= 0){
// 对业务逻辑进行判断,当输入年龄为负数时抛出异常
throw new Exception("输入的年龄有误,必须是正整数!");
}else {
System.out.println("此人年龄为:"+age);
}
}
public static void main(String[] args) {
// 下面的代码定义了一个try…catch语句用于捕获异常
int age = -1;
try {
printAge(age);
} catch (Exception e) { // 对捕获到的异常进行处理
System.out.println("捕获的异常信息为:" + e.getMessage());
}
}
}
运行结果:
5.5自定义异常
//Java允许用户自定义异常类,但自定义异常类必须继承Exception类或其子类。
源代码:
class DivideByMinusException extends Exception{
public DivideByMinusException (){
super(); // 调用Exception无参的构造方法
}
public DivideByMinusException (String message){
super(message); // 调用Exception有参的构造方法
}
}
public class Example09 {
public static void main(String[] args) {
// 下面的代码定义了一个try…catch语句用于捕获异常
try {
int result = divide(4, -5
);
System.out.println(result);
} catch (DivideByMinusException e) { // 对捕获到的异常进行处理
System.out.println(e.getMessage()); // 打印捕获的异常信息
}
}
// 下面的方法实现了两个整数相除,并使用throws关键字声明抛出自定义异常
public static int divide(int x, int y) throws DivideByMinusException{
if (y < 0) {
throw new DivideByMinusException("除数是负数");
}
int result = x / y; // 定义一个变量result记录两个数相除的结果
return result; // 将结果返回
}
}
运行结果:
5.6错题整理
***编译异常如果发生,就必须处理,要么捕获,要么抛出;
***编译异常是除了Runtimel Exception 编译时的异常;
***Throwable类是所有异常类的父类。