一.异常定义
用一个类来描述在代码编译或者运行期间可能遇到的各种错误.
Throwable:所有异常或错误的父类
**Exception**:异常
1.在编写代码期间:由编译器提出,被称之为受查异常
2.在运行代码期间:编译器无法检查的,被称之为非受查异常.也称为运行时异常.不是所有的运行时异常都需要被处理
常见面试题:说出5种常见异常,以及原因和解决办法,如何回避?
答:
**Error**:错误,通常是jvm抛出的,一般情况不需要处理Error
二.异常应用
throw: 抛出一个异常.
throws:声明此处可能会产生某种异常.(有可能会,不一定会.)
public class Demo {//throws Exception{类不能抛出任何异常
public static void main(String[] args) {
method();
}
/**
* throws只能用子啊方法声明处,用于声明此方法可能会产生某种异常
* throw 用在方法的真实的抛出一个异常对象
* @throws NullPointerException
*/
private static void method() throws NullPointerException{//throws
throw new NullPointerException("空指针异常");
}
}
try-catch-finally:
final,finally,finalize,说出三者区别
1.final 表示最终,可以修饰
1.1类(内部类可以,接口不可以)
不可以被继承
1.2方法不可以被重写
重写:存在继承关系中,子类更改父类的实现方式.改的是方法体.一个行为不同实现
重载:同一个类中,方法名相同,参数列表不同.不同特征不同的实现
1.3变量
引用:对象不能变
基本:值不能变
2.finally:
异常模块的最后一个模块,位于额外缓冲区,通常这里进行释放资源关闭资源
比如流 各种close
3.finalize
和GC有关(垃圾回器),不受人为调用,gc所处的线程是低级线程
public class Demo {//throws Exception{类不能抛出任何异常
public static void main(String[] args) {
//--try-catch 是异常处理语句块.
//try 中是可能产生异常的代码
//catch是对上面可能产生的异常进行捕捉,不产生则不执行catch
try {//try中如果有多条语句,其中任意一条语句产生异常.后续语句是不会执行的,直接catch捕获
System.out.println(1);
method();
System.out.println(2);
}catch (NullPointerException e){
e.printStackTrace();
return;
}catch (Exception e){
e.printStackTrace();
}finally{//异常捕捉的最后一个结构,代表最终还是会执行,用于关闭和释放各种资源,比如流,对象
/**
* 思考:finally一定会执行,如果在catch中存在return是什么情况
* finally中有return会有什么执行情况
*
* 类似:如果一个方法有返回值,在方法的内部声明一个局部变量,在方法结束时把该变量返回.问题是:局部变量应该保存在栈中
* 当方法结束,方法栈要释放该方法锁占用的栈资源.那么局部变量保持在哪里,锁返回的值是哪里来.
*/
}
}
/**
* throws只能用子啊方法声明处,用于声明此方法可能会产生某种异常
* throw 用在方法的真实的抛出一个异常对象
* @throws NullPointerException
*/
private static void method() throws NullPointerException{//throws
throw new NullPointerException();
}
}
三.异常处理原则
1、 能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。
因为对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。
2、 对于检查异常,如果不能行之有效的处理,还不如转换为RuntimeException抛出。
这样也让上层的代码有选择的余地――可处理也可不处理。
3、 对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,
将优雅的异常信息反馈给用户。