浅谈java中的异常机制
在java中Throwable类是异常和错误的超类,继承它的是Error和Exception两个子类。一个Error对象表示一个程序错误,指的是底层的不可恢复的严重错误,遇到Error,程序一定会退出,因为已经失去了运行所必须的底层物理环境。对于Error我们无法进行处理。而Exception是由特定因素导致程序无法继续,但不影响虚拟机的正常执行。而Exception又分为运行时异常(未检查异常)和非运行时异常(已检查异常)。运行时异常是由于程序员的疏忽或没有进行必要的检查而引起的程序问题,对于未检查异常可以不处理,编译可以通过。而非运行时异常是不可避免的,对于已检查异常必须做处理,否则编译通不过。对于继承自RuntimeException的异常都算是运行时异常,比如最常见到的IndexOutOfBoundsException或NullPointerException异常,这种异常都是由于程序在写程序时由于疏忽而导致的异常,这种异常编译器不会强制要求处理。
?像上述情况就属于运行时异常,编译器不会强制要求去检查除数是否为0,而只有当运行时才能知道是否会抛出异常。
?
在有可能抛出异常的地方放置try{}语句块,抛出的异常必须在某处得到处理。这个地点就是异常处理程序,而且针对每个要捕获的异常,得准备相应的处理程序。 异常处理程序在try语句后以关键字catch表示。
public class Rethrowing {public static void f() throws Exception{System.out.println("origination the exception in f()");throw new Exception("throw from f()");}public static void g()throws Exception{try {f();} catch (Exception e) {System.out.println("Inside g(),e.printStackTrace()");throw e;}finally{System.out.println("finish g method");}}public static void main(String[] args) {// TODO Auto-generated method stubtry {g();} catch (Exception e) {// TODO Auto-generated catch blockSystem.out.println("main:printStackTrace()");}System.out.println("ends main method");}}? 执行的结果是:
?origination the exception in f()
Inside g(),e.printStackTrace()
finish g method
main:printStackTrace()
ends main method具体的执行流程就不再赘述了。