一、前言
在java异常体系中,主要分为两大类,即异常类(Exception)和错误类(Error),它两都继承了Throwable类,而异常与错误最主要的区别在于异常是可恢复的,而当错误发生时,jvm会停止运行,是不可恢复的。
二、Exception(异常类)
1.异常概述
异常主要分为两大类,按照官方给出定义可将其分为Checked异常和No Checked异常。所谓Checked异常是指,在程序运行时可处理也可不处理的异常,其主要是指RunTimeException类及其子类。而Checked异常是指在程序运行时必须要处理的异常,除RunTimeException类及其子类外,包括自定义异常都属于Checked异常。
代码如下(示例):
import java.io.FileNotFoundException;
import com.apesource.demo.exception.CountTooLargeException;
public class Test {
public static void main(String[] args) {
// 如果方法声明中包含Checked 异常类型
// 则该方法的调用,必须使用try...catch处理
try {
dosth();
donothing();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (CountTooLargeException e) {
e.printStackTrace();
}
}
public static void dosth() throws FileNotFoundException{
int a = 23,b=33;
if(a > b) {
// 如果抛出的异常对象类型是一个No Checked异常,则可以使用throws声明异常类型
// throw new NullPointerException();
// 如果抛出的异常对象类型是一个Checked异常,则必须使用throws声明异常类型
throw new FileNotFoundException();
}
System.out.println();
}
2.java异常处理机制
java异常处理主要可分为两种,在当前类中捕获异常或者在抛出异常,让调用该方法的类或方法去处理该异常。
- 使用try、catch、finally代码块处理异常。
- 用于保护可能产生异常的代码
- catch:用于捕获运行时的"异常对象",并进行处理
- finally语句块中的代码,无论是否出现异常或return,均执行。
因为在try块中的代码,当产生异常时,会自动跳转至catch块中进行类型匹配,不能保证try块中的代码全部执行完,所以一般将必须要执行的代码都放到finally块中。
代码(示例):
import java.util.IllegalFormatConversionException;
public class Test01 {
public static void main(String[] args) {
// try : 用于保护可能产生异常的代码
try {
int num1 = 12, num2 = 6;
// 运行时,如果产生异常,系统会根据异常产生原因,创建异常对象
// 代码执行流程会自动跳转至catch块进行异常类型的匹配
int result = num1 / num2;
// 在此行代码前,未发生任何异常,本行代码方可执行
System.out.println("try结束");
} catch (ArithmeticException ex) { // catch:用于捕获运行时的"异常对象",并进行处理
ex.printStackTrace(); // 打印当前异常的堆栈信息
} finally {
// finally语句块中的代码,无论是否出现异常或return,均执行
// 除非虚拟机退出
System.out.println("finally.....");
}
// 在此行代码前,未执行return语句
System.out.println("程序结束");
}
}
- 使用throw关键字将异常抛出,交由使用当前方法的类或方法去处理。
- throw关键字:方法内部,抛出一个异常对象
- throws关键字:声明方法"可能"抛出的异常类型
三、(Error)错误类
错误类主要是指一些因电脑自身原因或jvm异常等等所产生的一种错误。
主要特点是不可恢复的,例如OutOfMemoryError:内存溢出错误,只能通过扩展内存的方式去恢复。