前言:
被混淆的“异常”和“错误”:
当我们自己在写代码的时候很多情况下都会因为各种原因造成一系列的错误,很多人都会把 错误 和 异常 两个概念混淆,在今天之前我也一直认为“错误就是异常,异常就是错误” 这是不对的。
异常通常指:我们的代码在编译的时候没有出错,但是一运行起来就会出错,比如我们要从一个文件中读取信息,可是这个文件不存在了,程序无法执行下去,故程序就要抓住这些异常,通过异常处理机制来抛出这些异常,程序员就可以通过抛出的异常信息来修改代码
错误:在我们的编辑器中例如: Eclipse中直接出现了红XX,这个表示我们的代码是有问题的,这种情况下就不属于异常,而是错误。
错误是不可避免出现的,一个健壮的程序必须有能力处理各种各样的错误
目前有两种方法来解决出现的错误:
方法一:通过判断返回错误码:
我之前写过的很多程序,有些地方都是通过判断来抛出可能发生的几种错误 用0表示错误 其他表示成功
例子:
int code= processFile("C:\\test.txt");
if(code == 0){
//OK;
}else{
//error:
switch(code){
case 1:
// file not found;
case 2:
//no read permission;
default:
//unknown error;
}
}
这种方法处理起来很麻烦,在一个健壮的程序中一定要避免使用这种方法!
方法二: 异常处理机制
java中的异常是一个class
1.异常的结构:
通过上图可以看到异常的根是Throwable,它继承自Object
2.Throwable分为两个体系:
Error | 表示严重的错误,程序对此一般无能为力。 例如: 1.OutOfMemoryError :内存耗尽 2.NoClassDefFoundError :无法加载某个Class | ||
Exception |
对于Excetion的异常 有些是可以捕获,有些不可以捕获 Exception 又分为两类不检查异常和检查异常:
|
3.Java规定:
必须捕获的异常: 包括Exception及其子类,但不包括RuntimeException及其子类,这类异常称为CheckedException。
不需要捕获的异常:包括Error及其子类,RuntimeException及其子类。
4.那么为什么RuntimeException异常我们可以不去捕获,这个问题一直是我的困惑,直到我看到了下面的帖子: