详解 异常exception(一)
Exception
java程序使用exception处理errors和别的异常事件。
1:什么是异常:异常是指在程序执行期间,打乱了正常的程序指令流而出现的异常事件。
exception是 excepitonal event 的 速记。
当方法中出现一个错误的时候,这个方法会创建一个对象切换到正在运行的系统,这个对象 叫做异常(exception)对象,异常对象中包含了出现错误的信息,异常的类型,以及此时运行程序的状态。创建一个异常对象在运行时系统中处理它的过程叫做抛出一个异常。
当一个方法抛出一个异常后,这个运行时系统尝试着去找处理这个异常的方式,这个一系列处理异常的方式是一系列顺序的方法调用的 列表,这个方法列表叫做调用栈。

上图是调用的方法栈。
运行时系统搜索调用栈,找一个包含这个异常处理代码块的方法。这段代码块叫做异常处理程序(exception handler),搜索的顺序是:从这个错我出现的方法开始,依次进行处理,这个顺序是方法调用的反顺序,例如以上调用栈---是从上到下查找的顺序。当合适的处理程序被找到,运行时系统传递这个异常到异常处理程序,异常处理程序考虑合适是根据抛出异常对象的类型和这个处理程序的类型匹配。
这个异常处理程序被选择叫做 捕获一个异常,如果运行时系统搜索调用栈中所有的方法但是没有找到合适的异常处理程序,这个运行时系统将终止。

上图为搜索调用栈找对应的异常处理程序的过程
2:异常的分类:一:异常处理方式java语言提供两种处理异常的方式:1:try语句捕获一个异常,try必须提供一个异常的处理。2:一个方法指定抛出一个异常,方法必须提供throws语句列出需要抛出的异常,相当于方法抛出一个指定的异常。并不是所有的异常都是需要捕获或者特定的抛出的,为了理解这句话,看三种不同的异常分类。一些程序员认为 Catch or Specify Requirement是一种有严重缺陷的异常机制,想通过使用unchecked exception 代替 checked exception,通常是不建议。
3:捕获处理异常1:解释异常这一小节描述如何使用try ,catch,finally语句块去实现异常处理程序处理,在Java SE 7 中也介绍了 try-with-resources语句,try-with-resources特别适用于关闭使用的资源,例如流。下列例子定义和实现了ListOfNumbers类,当构造的时候,包含了一个ArrayList---包含0-9是个Integer元素,这个类也定义了一个writeList方法,写这些数字进入Output.txt文件中:例子如下:public void writeList() { PrintWriter out = null; try { System.out.println("Entering" + " try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + vector.elementAt(i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } }}创建FileWriter对象失败有很多原因,如果程序不能创建或者写入显示的文件,将会抛出一个IOException异常,当FileWriter抛出一个异常的IOException的时候,运行时系统立刻停止try块的执行,调用的方法不完全执行了,运行时系统开始调用方法调用栈的顶端找到合适匹配的异常进行处理,在这个例子中,当IOException出现的时候,FileWriter构造方法在调用战斗顶端,但是FileWriter没有一个合适的异常处理程序,因此运行时系统检查下一个方法,即writeList方法,在这个方法的调用栈中,writeList方法有两个异常处理程序,一个IOException和一个IndexOutOfBoundsException,运行时系统顺序的检测在try语句块后出现的catch种类,第一个处理程序的参数类型是IndexOutOfBoundsException,这和抛出的异常不匹配,因此运行时系统检测下一个异常处理程序---IOException,运行时系统找到了匹配的异常处理程序,catch块中的代码被执行。异常处理程序执行完毕后,运行时系统传递控制到finally块,不管catch是否被调用,finally块中的代码执行。在这个例子中FileWriter从来没有打开,因此不需要继续关闭,当finally执行完毕后,程序继续执行finally块后的第一个语句。以下是抛出IOException的输出:Entering try statementCaught IOException: OutFile.txtPrintWriter not open另外一种情况try块正常结束:这种情况下所有的语句成功执行没有异常发生,执行完try块以后,运行时系统传递控制到finally块,因为所以的都是成功执行,PrintWriter是打开的,当执行到finally时,关闭PrintWriter关闭,再一次的,finally块完成执行,程序继续执行finally块结束后的语句块,下面是没有抛出异常的执行结果:
Entering try statementClosing PrintWriter