java(SE)异常
1.异常简介
Throwable 类是 Java 语言中所有错误或异常的超类(这就是一切皆可抛的东西)。它有两个子类:Error和Exception。
Error:用于指示合理的应用程序不应该试图捕获的严重问题。这种情况是很大的问题,大到你不能处理了,所以听之任之就行了,你不用管它。比如说VirtualMachineError:当 Java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误。好吧,就算这个异常的存在了,那么应该何时,如何处理它呢??交给JVM吧,没有比它更专业的了。
Exception:它指出了合理的应用程序想要捕获的条件。Exception又分为两类:一种是CheckedException,一种是UncheckedException。这两种Exception的区别主要是CheckedException需要用try...catch...显示的捕获,而UncheckedException不需要捕获。通常UncheckedException又叫做RuntimeException。《effective java》指出:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。
2.异常的处理
对应非运行时异常,必须对其进行处理。处理方式有两种:
使用try…catch…finally语句块进行捕获
在产生异常的方法所在的方法声明throws Exception,直接抛出给上一级。
对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。
3.捕获异常
第一种方式是try、catch语句捕捉
try {
FileInputStream fs = new FileInputStream("D:\\demo.txt");
} catch (FileNotFoundException e) {
//打印出异常
e.printStackTrace();
}
第二种是直接抛出,交给jvm进行处理
public static void getName() throws Exception {
System.out.println("name:"); throw new Exception(); }
public static void main(String[] args) throws Exception { execute();} 对于有关调用资源的类来说,关闭资源是至关重要的。但此时若有异常发生,资源容易关闭失败,此时,可以使用finally语句处理。无论程序怎样运行最后都会执行finally语句。
try {
FileInputStream fis = new FileInputStream("D:\\demo.txt");
} catch (FileNotFoundException e1) {
//异常转型:将异常以新的类型的异常再抛出,这样做一般为了异常的信息更直观
throw new Exception();
} finally {
fis.close();
}
4.自定义异常
自定义异常通常是定义一个继承自Exception类的子类。一般情况下我们都会直接继承自Exception类,而不会继承某个运行时的异常类。
public class MyException extends Exception{
public MyException(){
super();
}
public MyException(String msg){
super(msg);
}
}
5.总结
对于异常语句块的使用要注意
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。