一.异常处理机制
使用try…catch捕获异常,在try块中执行语句,在catch中处理异常.
try {
in = new FileInputStream("test.txt");
int b1=in.read();
System.out.println(b1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{ in.close(); }
使用finally块可以在程序发生异常时,执行必要的操作,例如流的关闭
JDK1.7后,在try中打开的资源会确保被关闭.
二.异常类结构图
图片来源于互联网
从结构图上可以看到异常主要分为两种: Exception和Error,它们都继承自Throwable
对于错误,一般是与JVM有关的问题,如系统崩溃,动态链接失败,通常不可恢复.
对于异常,一般是由于程序本身的问题.应该使用catch捕捉后处理.
常见的异常:
IndexOutOfBoundsException: 数组引用越界异常
NullPointerException: 空指针异常
NumberFormatException: 数字格式化异常
ArithmeticException: 算术运算异常(除零)
三.Checked异常和Runtime异常
在程序中Checked异常必须要捕获处理,否则无法编译通过.
处理Checked异常的方式:
1.直接用catch捕捉后处理.
2.在方法声明时使用 throws 抛出异常,在方法内部使用 throw 抛出一个异常,交给上层处理.
而Runtime异常非常灵活,可以不用声明或处理.也可以用try…catch块捕捉后处理.
四.自定义异常类
创建类时继承Exception 即可
public class ActionException extends Exception{
}
异常对象的printStackTrance()方法可以打印出异常信息栈,根据这些信息可以找到异常的源头.
五.异常处理的一些规则
1.不要过度使用异常.对于程序中可以预料的错误,应该编写错误处理代码.虽然异常机制很方便,但是绝对不能用异常代替错误.对于不可预料的,未知的错误时才使用异常.
2.单独处理各个异常块.尽量避免在一个try块中编写大量的语句,使用大量的catch捕捉异常.这通常会造成混乱,无法清晰理解程序.
3.对于捕获到的异常,不应该简单的进行忽略.可以实施处理或者抛出异常.
4.在合适的层次处理异常.将底层数据错误信息发送到用户层是非常失败的,那些信息对用户操作根本没有任何帮助.