一、异常的概念
在Java编程中,异常是指在程序执行过程中可能发生的错误或问题,这些问题可能会导致程序无法继续正常运行,异常可以分为两种类型:编译时异常和运行时异常。
1.编译时异常是在编译阶段被检测到的异常,程序员在代码中必须显示地处理这些异常,否则无法通过编译。比如,文件不存在,输入输出错误等都属于编译时异常。处理这类异常通常需要使用try-catch块,将可能出现异常的代码放在try块中,然后在catch块中处理异常情况,以确保程序的稳定性。
2.而运行时异常是在程序运行过程中出现的异常,它们通常是由程序逻辑错误引起的,如除以零,数组越界等。与编译时异常不同,运行时异常在代码中并不要求必须进行显示的异常处理,但合理的异常处理仍然能够提升程序的健壮性。运行时异常的出现会导致程序的中断,因此编程者需要通过合适的逻辑和条件来预防这些异常的发生。
要合理处理异常,常用的方式是使用try-catch语句块来捕获异常。try块内放置可能引发异常的代码,而catch块内则编写处理异常的逻辑。此外,还可以使用finally块,不论异常是否发生,其中的代码都会被执行,常用于释放资源等操作。
二、运行时错误与异常
在程序运行中,任何中断正常流程的因素都被认为是异常。JAVA语言用JAVA类来描述异常,所有异常类的祖先类为Java.lang.Throwable类。
Throwable类有两个直接子类:
(1)Error类:表示单靠程序本身无法恢复的严重错误,比如内存空间不足,或者JAVA虚拟机的方法调用栈溢出。在大多数情况下,遇到这样的错误时,建议让程序终止。
(2)Exception类:表示程序本身可以处理的异常,当程序运行时出现这类异常,应该尽可能地处理异常,并且使程序恢复运行,而不应该随意终止程序。
常见异常类的类框图:
三、异常分类
Exception类还可以分为两种:非检查异常和检查异常。
(1)非检查异常:RuntimeException类及其子类都称为非检查异常,也叫运行时异常,这种异常的特点是JAVA编译器不会检查它,也就是说,当程序中可能出现这类异常时,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
(2)检查异常:除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常。这种异常的特点是JAVA编译器会检查它,也就是说,当程序中可能出现这类异常时,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
四、异常处理机制
JAVA编程语言使用异常处理机制为程序提供了错误处理的能力。
JAVA的异常处理是通过5个关键字来实现的:try、catch(捕获)、finally、throw(抛出)、和throws。
try:当某段代码在运行时可能产生异常的话,应该把这段代码放到try语句块中去。
catch:在catch语句块中捕获异常,catch语句块的参数类似于方法的声明,包含一个异常类型和一个异常对象。异常类型一般是Java.lang.Exception类或者它的子类。
fianlly:无论是否产生异常,finally所指定的代码都要被执行。通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。
throws:总是出现在方法的声明中,用来标明该方法可能抛出的各种异常。
throw:总是出现在方法体中,用来抛出一个异常。
1.try-catch语句:捕获异常
在JAVA语言中,用try-catch语句来捕获异常,格式如下:
try{
可能会出现异常情况的代码
} catch (SQLException e){
处理操作数据库出现的异常
} catch (Exception e){
处理操作输入流和输出流出现的异常
}
注:try在使用的时候要注意try代码块不能独立出现,必须和catch代码块、finally代码块搭配使用,其使用规则是try代码块后可以跟0个或多个catch代码块,0个或1个finally代码块,try代码块后可以只跟一个finally代码块。
2.throws声明异常
如果在一个方法体中抛出了异常,就希望调用者能够去及时地捕获异常,JAVA语言中通过关键字throws声明某个方法可能抛出的各种异常。
//throws声明异常,在方法的小括号和大括号中间写,如果需要声明多个异常,
//中间用逗号分隔开
//声明异常并不是处理异常
public void method1() throws ClassNotFoundException {
Class.forName("com/haina365/lesson15/ExceptionTest03.java");
}
public void method2() throws ClassNotFoundException {
method1();
}
3.throw抛出异常
在JAVA语言中,使用throw关键字来抛出异常。
public static void main(String[] args) {
int[] a = new int[5];
int i = 5;
if (i>a.length){
//throw抛出异常,创建异常对象将其抛出
throw new ArrayIndexOutOfBoundsException("数组越界");
}else {
System.out.println(a[i]);
}
}
五、自定义异常
使用JAVA内置的异常类可以描述在编程时出现的大部分异常情况。
除此之外,用户只需继承Exception类即可自定义异常类。
在程序中使用自定义异常,可分为以下步骤:
(1)创建自定义异常类
(2)在方法中通过throw关键字抛出异常对象
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常
//自定义异常需要先继承Exception,然后在需要抛出异常的时候通过throw抛出new出来的异常
//对象,同时还需要在方法上声明一下该异常
public class ExceptionTest06 extends Exception {
public ExceptionTest06(){
super("数组下标越界异常,请检查代码");
}
public static void main(String[] args)throws ExceptionTest06 {
try{
int[] a = new int[5];
System.out.println(a[5]);
}catch (ArrayIndexOutOfBoundsException e){
throw new ExceptionTest06();
}
}
}