前言
本文对JAVA异常以及异常分类进行了简单的介绍,介绍了JAVA中异常捕获,资源回收,异常抛出的使用方法,最后在文末简单提及自定义异常
一、JAVA异常介绍
1.什么是异常?
异常是指出现在程序运行过程中产生的错误,异常的发生往往会中断程序的运行。在JAVA语言中,异常本身也是一个对象,程序发生异常就会产生一个异常对象。
2.异常的分类
异常体系结构如下
Thorwable类(继承后类可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示程序中的错误和异常。
其中异常是本文的重点,异常类又分为运行时异常(RuntimeException)和非运行时异常,也称之为非受检异常和受检异常。
- 错误(Error)和异常(Exception)
Error:通常为程序不应该尝试捕获且无法解决的严重问题,这类错误大多与程序编写者的操作无关,由JVM产生并抛出。Error产生时,JVM通常选择线程终止。
Exception:是程序自身可以进行处理的异常,这种异常分运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。 - 运行时异常和非运行时异常
非运行时异常(受检异常):受检异常顾名思义是在程序进行编译前就可以由编译器检查除的异常,编译器要求必须处理的异常,否则无法通过编译,如IOException、SQLException
运行时异常(非受检异常):此类异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常在程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
二、异常处理
1. 异常捕获
使用try…catch关键字进行异常捕获,且异常捕获必须存在try和catch块,使用如下
try {
//可能产生异常的代码块
}catch (Exception e){
//异常处理
}
多重捕获使用示例如下
try {
//业务代码略去
}catch (ArithmeticException e1){
System.out.println("算数异常");
}catch (IndexOutOfBoundsException e2){
System.out.println("数组越界异常");
}catch (Exception e3){
System.out.println("其他异常");
}
- 在try块中,如果某行代码出现了异常,那么这行代码以下的代码将不会执行,转而去执行对应catch块的代码
- 在多重catch块的实例中,子类异常的catch块一定要写在父类的上面,如果将示例中的Exception写作第一个catch块,代码将不能通过编译
- 在上述多重捕获实例中,如果代码块中出现了非算数异常和数组越界异常,那么将会由第三个catch块进行处理
2. 资源回收
使用finally关键字进行资源回收,在异常捕获中属于可选项,使用如下
try {
//可能产生异常的代码块
}catch (Exception e){
//异常处理
}finally {
//资源回收
}
- 在try块中可能会创建了一些需要回收的资源,如果将回收资源语句都写在try块中,在try中出现异常的时候有可能会导致回收资源语句无法被执行。将回收资源语句写在finally块中可以避免上述问题
- 异常捕获中,除了终止JVM这种情况外,无论是否有异常被捕获,finally块都必定执行(在try和catch块内语句都执行完后执行finally块)。
- 在有return语句的情况下,先执行return语句,再执行finally块,最后return返回
- finally块中的return语句会覆盖try块中的return返回
3. 获取异常信息
Throwable类提供了以下几个常用方法来获取异常信息
getMessage() :返回此异常的详细消息字符串。
printStackTrace():将此异常及其追踪输出至标准错误流。
printStackTrace(PrintStream s):将此异常及其追踪输出到指定的输出流。
getStackTrace():返回此异常的跟踪栈信息。
4. 异常抛出
使用关键字throw和throws完成异常抛出
throws
当一个方法没有能力或不知道怎么处理某异常,或方法中可以抛出某异常,可以在方法声明时使用throws关键字声明抛出异常,使用如下
public void method() throws ArithmeticException,IndexOutOfBoundsException{
}
- 上面的代码声明了method方法可能回抛出算数异常和数组越界异常,在方法体中,若出现了算数异常或数组越界异常,method方法将不对异常进行处理(若出现其他异常则仍正常在method方法内处理)而是向上抛出,交给调用者进行处理。
- 如果到了main方法仍然进行抛出,即没有处理某异常,则没有被处理的异常交由JVM处理,JVM回打印该异常的跟踪栈信息,并中止程序运行
- 如果一个方法内没有捕获受检异常(非运行时异常),则必须使用throws关键词声明抛出异常,否则不通过编译。
throw
可以使用throw关键字手动抛出异常,使用如下
throw new IndexOutOfBoundsException("使用throw抛出异常")
使用throw关键字抛出的异常与程序运行中自然产生的异常没有区别,处理方式和声明抛出方式相同,不再赘述。
三、自定义异常
自定义异常类的使用较为简单,继承Exception类即可,直接给出示例
此处随意生成了两个构造方法,在自定义异常的实际使用中,可以自行加入业务需要的成员变量以及方法,只要继承了Exception类,就可以正常的进行捕获,抛出等操作。
public class MyException extends Exception {
public MyException() {
}
public MyException(String message) {
super(message);
}
}
本篇内容到此结束
作者才疏学浅,如文中出现纰漏,还望指正