Java 中异常大致分为两类:checked 异常和 unchecked 异常。
1 Checked 异常
Checked 异常是指在方法声明中通过 throws 关键字明确声明的异常。这种异常在编译时必须被处理,否则编译器就会抛出错误。
Checked 异常通常用于一些必须要处理的异常,比如文件不存在或者网络连接中断等等。
处理机制:必须通过 try/catch 块或者 throws 子句对 checked 异常进行处理。
对于客户端和开发人员的要求:必须捕获或者声明 throws 对应的 checked 异常。
示例代码:
import java.io.FileNotFoundException; import java.io.FileReader;
public class CheckedExample {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("/test/file.txt"); }
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
}
2 Unchecked 异常
Unchecked 异常是指在运行时抛出的异常,这种异常不需要在方法声明中声明或者捕获。
Unchecked 异常通常是由程序中的错误操作或者资源不足引起,比如数组越界、空指针引用等等。
处理机制:程序在运行时抛出 unchecked 异常,必须通过程序员自己的代码来避免这些异常的发生,比如检查参数是否合法、检查资源是否足够等等。
对于客户端和开发人员的要求:程序员需要意识到 unchecked 异常的存在,并且在编写代码的时候避免抛出这种异常。
示例代码:
public class UncheckedExample {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
3 注意事项
首先,根据向老师当天答疑的结果,对于一个自定义的异常,根据终端控制台的信息打印,其实是很难甚至无法判断出它是checked异常还是unchecked异常的(特指某道哈工大软构往年选择题,就下面那题),引用老师的话,“抛出异常最终的目的是解决问题,这个时候去具体区分这个异常其实在正式的软件构造过程中没有太大的意义”。
比如,下面这个unchecked异常,不看异常名字的话其实不太分得出来:
其次,软件抛出异常的第一现场是第一个抛出该异常的函数(可以这么理解吧)。
比如main调用A,A调用B,B调用C,然后C抛出了一个异常,一层一层没人处理,直到从main抛给外界客户端,这个的第一现场为C。
最后,关于捕获(catch)的问题,我们老师(wzj)表示:“一般情况下,实际还有考试中他出题不会有catch一个异常然后再把它转换异常类型再throw的可能操作,考虑这种稀奇古怪的操作没有意义”。
不过下面的D还是错的,因为他throw了一个异常,而这种操作也属于异常处理的一种。
这道题在我们这届争议很大,另外也有几题感觉出的不是很好(甚至有题答疑的时候老师表示两个选项都是对的,寄),希望我做到的选择题里不会出现这种“最恰当” 。