目录
按照异常需要处理的时机分为编译时异常(强制性异常、CheckedException)和运行时异常(非强制性异常、RuntimeException)。
只有Java提供了checked异常,Java中认为checked异常都是可以被处理的,不处理checked的异常的话程序在编译时就会报错,代码根本没有机会去执行。
对checked异常的处理方法有两种:
运行时异常只有在代码运行时才会发生,常见有除数是0下表越界等,其产生频繁处理麻烦,若显示声明或者捕获对程序的可读性好运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序,当然如果你有处理要求也可以显示捕获他们。
- public int getNum(){
- try {
- int a = 1/0;
- return 1;
- } catch (Exception e) {
- return 2;
- }finally{
- return 3;
- }
代码走到第3行时遇到了一个MathException,这时第4行的代码就不会执行了,代码直接跳转到catch语句中。最后到第6行时,异常机制有一个原则是如果在catch中遇到了return或异常等能使该函数终止的话,那么有finally就必须先执行完finally代码块里面的代码然后再返回值。因此代码又跳到了第8行,可惜第8行是一个return语句,那么这时方法就结束了,因此第6行的返回结果就无法被返回。如果finally仅仅是处理了一个释放资源的操作,那么该方法的将返回第6行的值。
error类和exception类的父类都是throwable类,它们的区别如下:
error类一般是指与虚拟机有关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误建议让程序终止。
exception类表示程序可以处理的异常,可以捕获可能恢复。遇到这类异常应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
exception类又分为运行时异常和编译时异常,运行时异常如ArithmaticException,IllegalArgumentException,编译能通过但是一运行就终止了,程序不会处理运行时异常;编译时异常要么用try...catch捕获,要么用throws语句声明抛出,交给它的父类处理,否则编译不通过。
Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为 java.lang.Throwable,
Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题。
Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常
(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题, 是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try..catch 处理或用 throws 声明继续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用 try..catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常。
throw:
throws: