Java 8中将派生于 Error类 或 RuntimeException类的所有异常称为非检查型(unchecked) 异常,
所有其他的异常称为检查型(checked)异常。
也就是,非检查型异常包括Error 和 RuntimeException;剩下的就是检查型异常。
可知,常见的RuntimeException为非检查型异常,
而非检查型异常不只是RuntimeException。
检查型异常(CheckedException) 用于表示可恢复的异常(也就是你必须检查的异常);
而非检查型异常(RuntimeException、Error)表示不可恢复的异常(也就是运行时异常,主要是程序bug和致命错误,不需要程序员来检查)。
非检查型异常
谁去检查:编译器
谁去处理:用户或者 不处理
什么时候发生:运行时异常
需要干什么:修改错误的代码、抛出给父类、或者输出一条提示信息(一般用于自定义异常)
非检查型异常要么在你的控制之外(Error),要么是由一开始就应该避免的情况所导致的(RuntimeException)。
例如:你的程序逻辑本身有问题,
比如数组越界、访问null对象,这种错误你自己是可以避免的。
编译器不会强制你检查这种异常。
常见的RuntimeException类型的异常主要有以下几种。
□ ArithmeticException:数学计算异常。
□ NullPointerException:空指针异常。
□ NegativeArraySizeException:负数组长度异常。
□ ArrayOutOfBoundsException:数组索引越界异常。
□ ClassNotFoundException:类文件未找到异常。
□ ClassCastException:类型强制转换异常。
□ SecurityException:违背安全原则异常。
检查型异常
谁去检查:编译器
谁去处理:用户必须处理
什么时候发生:编译时异常
需要干什么:(try …catch)或者 在方法首部抛出异常(两者其一必须要做)
例如:一个读取文件的方法代码逻辑没有错误,
但程序运行时可能会因为文件找不到而抛出FileNotFoundException,
如果不处理这些异常,程序将来肯定会出错。
所以编译器会提示你要去捕获并处理这种可能发生的异常,不处理就不能通过编译。
下面是jdk给的格式示例:
private static void Write(){
try{
File file =new Filw("Filename.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps =new PrintStream(fos);
ps.print("blahblah");
ps.close();
}catch(IOException e) {
e.printStackTrace();
}
}
private static void Write()throws IOException{
// 创建文件“Filename.txt”对应File对象
File file =new Filw("Filename.txt");
FileOutputStream fos = new FileOutputStream(file);
// 创建FileOutputStream对应的PrintStream,方便操作。PrintStream的写入接口更便利
PrintStream ps =new PrintStream(fos);
ps.print("blahblah");
ps.close();
}
常见检查型异常主要有以下几种。
□ NoSuchMethodException:方法未找到异常。
□ IOException:输入输出异常。
□ EOFException:文件已结束异常。
□ FileNotFoundException:文件未找到异常。
□ NumberFormatException:字符串转换为数字异常。
□ SQLException:操作数据库异常
一个例子以总结:
假设一个Download函数,
根据传入的URL (String参数,如,URL:file://vms.host.edu/disk$user/my/notes/note12345.txt)
去访问一个网页中的.txt文本。
就有以下两种情况:
1.如果传入的URL 参数是null,比如note12345.txt或者路径不存在
表明该函数的调用者出现bug了,
而程序本身的bug是很难在运行时自我恢复的。
这时候就需要让Download函数抛出非检查型异常(RunntimeException),
如NullPointerException。
并且Download函数的调用者不应该尝试处理这个异常,
必须让它尽早地暴露出来(比如让JVM自己终止运行)。
2.如果传入的URL参数是一个不合法的URL格式的字符串(可能格式输错了),
这时候Download函数需要抛出检查型异常(CheckedException),如IOExcepiton。
并且Download函数的调用者
必须捕获该异常和进行相应的处理
如:
throw new IOException("请重新输入 URL");