异常处理
异常是什么?
异常(Exception)是程序在执行过程中所产生的问题。
对于异常的处理,方法有三种选择:
- 捕获这个异常,不让它沿着调用栈继续向下抛出
- 捕获这个异常,并继续向下抛出
- 不捕获这个异常,从而导致方法从调用栈中被弹出,异常对象继续抛给调用栈下面的方法
异常的API结构
Error:错误 是所有错误类的父类
应用程序不应该图捕获的严重问题
可以捕获,不能处理
Exception:异常 是所有异常类的父类
指出了应用程序想要捕获的条件
可以捕获,可以处理
Throwable类
在Throwable类中有两个方法,可以用于获取抛出异常的信息
public String getMessage()
public void printStackTrace()
final、finally、finalize区别
1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,即不能方法重写。
2、finally是java的异常处理机制,我们经常会将finally语句放在try…catch…语句后面作为一种补充,因为finally语句不管代码有没有异常都会执行,这样我们可以用finally语句维护对象内部状态,清理非内存操作,例如我们可以使用finally语句来关闭流或者数据库等操作。
如果有一个块代码不管是否发生异常抛出都要被执行,我们使用关键字finally
try{
for(int i=5;i>=0;i--){
System.out.println(10/i);
}catch(Exception e){
System.out.println("Exception:"+e.getMessage());
}finally{
System.out.println("finally语句被执行")
}//无论发生什么情况finally中的内容都会被执行但必须跟在try..catch后面
}
3、finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
异常的分类
编译期异常(检查异常):开发者必须处理,否则无法通过编译
throw写在方法里面,自己引发异常,抛给外面处理
要想通过编译可以在方法()后面加throws…Exception,Exception(声明抛出异常)跑出去,若最后扔到了虚拟机,则虚拟机还是会把程序直接关了,所以还是必须要处理
运行期异常(非检查异常):开发者可以处理,也可以不处理,即使不处理也可以通过编译
所有的运行期异常都是RuntimeException的子类