为什么用异常:异常处理使得程序可以处理非预期的情景,并且继续正常的处理。
在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常。这里我将记录如何利用异常还程序一个“完美世界”。
异常处理最根本的优势就是将检测错误(由被调用的方法完成)从处理错误(由调用方法完成)中分离出来。(也就是没有那么多if语句了)
异常的处理三种操作:①声明异常(throws) ②抛出异常(throw) ③捕获异常(try-catch)
以调用method()方法为例
public class ExceptionDemo {
public static void main(String[] args) {
//捕获一个异常
try {
method();
}catch(Exception ex){
//做一些异常的处理
}
}
public static void method() throws Exception{ //throws声明异常
int a = 1;
if(a==0) {
throw new Exception(); //抛出一个异常对象
}
}
}
声明异常
1、每个方法都必须用throws声明它可能抛出的必检异常,免检异常不要求显式声明(必检异常和免检异常在下一节有说明)
2、throws后又多个异常时用逗号分隔异常列表
3、如果方法没有在父类中声明异常,那么久不能在父类中对其进行继承来声明异常。
抛出异常
1、抛出的其实是一个异常类的对象 throw new Exception();
2、java API异常类至少有两个构造方法:一个无参构造方法和一个可描述这个异常的String参数的构造方法(它可用getMassage()获取)。
捕获异常
异常处理器:处理一个异常的代码
捕获一个异常即从当前方法开始,沿着方法调用链,按异常的反向传播方向找到一个可以处理该异常的异常处理器。
问:对那些该异常处理却没有异常处理的部分,java怎么处理
答:如果在调用的方法链中找不到处理器,程序就会终止并且在控制台上打印
需要注意的是:
①一个通用的父类可以派生出各种异常类,而父类可以捕获子类的异常(但不建议,尽量特事特办)
②父类的catch块必须在其子类catch块后面
③如果方法声明了一个必检异常,就必须在try-catch块中调用它,或者再调用方法中声明要抛出异常,而后再次抛出给其他方法去处理
获取异常信息
java.lang.Throwable类中有以下实例方法可以获取有关异常的信息。
+getMessage():String (返回描述该异常对象的信息)
+toString():String (返回三个字符的连接:1)异常类的全名;2)“:”(一个冒号和空白)3)getMessage(方法))
+getStackTrace():StackTraceElement [ ] 在控制台打印Throwable对象和它的调用堆栈信息。返回和该异常对象相关的代表堆栈跟踪的一个堆栈跟踪元素的信息
异常的分类
异常类可以三种主要类型:①系统错误(Error) ②运行时异常 (RuntimeException)③异常(Exception)
而系统错误和运行时异常及它们的子类都称为免检异常,其他异常都为必检异常。
finally子句
try{
调用方法
}catch{
异常处理
}finally{
一定会执行的语句
}
无论异常是否产生,finally子句总是会被执行的。
=======================================分隔线===================================================后面还有 何时使用异常、重新抛出异常、链式异常、创建自定义异常四部分内容将会更新