0%

java异常处理

异常概述

在程序中,错误可能产生于程序没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据,试图打开一个不存在的文件夹等。在java中这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常的指令流。

处理程序异常错误

​ 在java中,如果某个方法抛出异常,既可以在当前方法中捕获异常,也可以将异常向上抛出,由方法调用者来处理。

错误

1
2
3
4
         String s="xhy";
System.out.println(s+"年龄是:");
int age=Integer.parseInt("20L");
System.out.println(age);

​ 在本段代码中,实现将非字符型数值转换为int型,程序会报出异常。

image-20210530090934105

​ 可以看出,本实例报出的是NumberFormatException(字符串转换为数字异常)。提示信息“xhy年龄是”已经输出,而变量age没有输出,可知程序在执行类型代码转换时已经终止。

捕捉异常

​ java语言的异常捕获结构是由try,catch和finally三部分组成,try语句存放的是可能发生异常的java语句;catch程序块在try之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句中的代码块如何退出,都将执行finally语句块。

​ 语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
finally{
//finally程序块
}

利用try -catch语句对刚刚代码行进行修改

1
2
3
4
5
6
7
8
9
try {
String s="xhy";
System.out.println(s+"年龄是:");
int age=Integer.parseInt("20L");
System.out.println(age);
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("over");

image-20210530091539131

​ 可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。当try代码块中的语句发生异常时,程序就会跳转到catch中执行,执行完catch中的代码块后,将继续执行catch后的代码块。由此可知,java的异常处理是结构化的,不会因为一个异常而影响整个代码的执行。

注意. Exception是try代码块传递给catch代码块的变量类型,e是变量名。
异常捕捉函数

这里介绍三个异常捕捉函数:

getMessage()函数:输出错误性质。

image-20210530011148818

toString()函数:给出异常的类型与性质。

image-20210530091428578

printStackTrace()函数:

见上图。

注意:前两个函数需要打印,而第三个不需打印。

finally语句块

完整的异常处理语句一定要包含finally语句,但以下四种情况finally语句不会被执行。

(1)在finally语句块中发生异常。

(2)在前面的代码中使用了System.exit(0)退出了程序。

(3)程序所在的线程死亡。

(4)CPU关闭。

自定义异常

用户只需要继承Exception类即可自定义异常类。

在程序中使用自定义异常类,大致可分为以下几个步骤:

(1)创建自定义异常类。

(2)在方法中通过throw关键字抛出异常类。

(3)若在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常方法的调用者中捕获并处理异常。

创建自定义异常,在项目中创建类MyException,该类继承Exception。
1
2
3
4
5
public class MyException extends Exception {
public MyException(String ErrorMessage) {
super(ErrorMessage);
}
}
在项目中创建类Tran,该类中创建一个带有int型参数的方法avg(),该方法用来检测参数中是否有数小于0,如果存在,则通过throw关键字抛出MyException异常对象,并在main函数中捕捉。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Tran {
static int avg(int number1,int number2)throws MyException{
if(number1<0||number2<0) {
throw new MyException("不可使用负数");
}
return(number1+number2)/2;
}
public static void main(String[]args) {
try {
int result=avg(102,-2);
System.out.println(result);
}catch(MyException e) {
System.out.println(e);
}
}
}

运行结果如图

image-20210530145801591

运行时异常

Java类库的每个包都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误一般比较严重。Exception类称为非致命类,可以通过捕捉处理使程序继续执行。

异常的使用原则

(1)在当前方法声明中使用try-catch语句捕获异常。

(2)一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。

(3)如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。

建议:不要将异常抛出,应该编写异常处理语句。