异常处理
1.异常的定义
在Java语言中,将程序运行期间发生的不期而至的各种意外状况(除开发过程中的语言错误和逻辑错误)称为异常,如文件找不到、网络连接失败、非法参数等。
2.异常的种类
Java异常是Throwable子类的实例化对象。Throwable有两个重要的子类:Exception(异常)和Error(错误)。
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError(栈溢出)和OOM(内存溢出)。一般不编写针对性的代码进行处理。
Error和Exception的区别:
Error和Exception都有一个共同的根类是Throwable类。
Error是系统中的错误,程序员是不能改变的和处理的,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。因此我们编写程序时不需要关心这类错误。
Exception,也就是我们经常见到的一些异常情况,表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
public class ExceptionTest {
public static void main(String[] args) {
/*
* 1、运行时异常:java.lang.ArithmeticException
* 原因:ArithmeticException
* */
int a = 10;
int b = 0;
System.out.println(a / b);
/*
* 2、编译期异常:java.io.FileNotFoundException
* 原因:文件找不到异常通常是两种情况:1、系统找不到指定的路径 2、拒绝访问(指定的是目录时,就会报拒绝访问异常)
* */
FileInputStream fis = new FileInputStream("a.txt");
}
}
3.throw和throws
(1)抛出异常throw
在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不台法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。
在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。
抛出异常后:
① 创建一个异常对象。封装一些提示信息。
② 通过关键字throw将这个异常对象告知给调用者。
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
使用格式:
throw new xxxException(“异常产生的原因”);
注意:
① throw关键字必须写在方法的内部。
② throw关键字后边new的对象必须是Exception或者Exception的子类对象
③ throw关键字抛出指定的异常对象,我们就必须处理这个异常对象。
Throw关键字后边创建的是RuntimeException或者是RuntimeException的子 类对象。我们可以不处理默认交给JVM处理(打印异常对象,中断程序)。throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异 常,要么throws,要么try…catch。
(2)声明异常throws:
将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。
语法格式:
(修饰符)(返回值类型)(方法名)(参数列表)throws Exception1,Exception2,…{…}
4.捕获异常try…catch
如果异常出现的话,会立刻终止程序,所以我们得处理异常:
① 该方法不处理而是声明抛出,由该方法的调用者来处理(throws)。
② 在方法中使用try…catch的语句块来处理异常。
try-catch的方式就是捕获异常。
● 捕获异常: Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方 式的处理。
捕获异常语法如下:
try{
//可能产生异常的代码
}catch(/*定义一个异常的变量,用来接收try中抛出的异常对象*/){
//异常的处理逻辑,异常对象之后,怎么处理异常对象
//一般在工作中。会把异常的信息记录到一个日志中
}
catch(/*异常类名变量名*/){
}
注意:
① try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
② 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,维续执行try…catch之后的代码
③ 如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try…catch之后的代码
5.finally
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
finally的语法:
try…catch…finally : 自身需要处理异常,最终还得关闭资源。