JAVA异常处理机制

来源:互联网 发布:linux sqlplus找不到 编辑:程序博客网 时间:2024/05/17 21:53

1、  Java异常处理类结构图


1)       两种分类方法

[1].  按照程序可以处理或者不能处理分为:Error(错误)和Exception

Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):程序本身可以处理的异常

Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。

[2].  按照编译器是否可识别,分为checkedexception和unchecked exception

checked exception:编译器可以识别的异常,这类异常必须在代码中进行处理才能通过编译。也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。包含除RuntimeException及其子类之外的类代表的异常。

unchecked exception:是编译器无法识别的异常,可能在运行时产生。包含RuntimeException及其子类。

2)、  throw与throws

throw 用在语句中,创建一个新的异常对象;throws用在方法上指明该方法可能跑出的异常

3)、  finally 与return

[1].  不管有木有出现异常,finally块中代码都会执行;

[2].  当try和catch中有return时,finally仍然会执行(先讲try/catch中return之前的代码执行完(如果return中有代码,也要先于finally之前执行),再执行finally中的代码,然后再回到try/catch中执行return);

[3].  finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的(finally部分可理解为另一次方法调用,finally中对变量的操作相当于其局部变量);

[4].  finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

如下列子:

public class MyTest

{

    static int mainx=1;

  

    public static void main(String[] args){

   

   

       System.out.println("test() is returned,a="+test());       

    }

   

   static int test(){

    int a = 6; 

       int b = 0; 

       try { // try监控区域 

              

           if (b == 0)throw new ArithmeticException();//抛出异常,后面代码不执行 

           a++;

         returna;

            

       } 

       catch (ArithmeticExceptione) { // catch捕捉异常 

           System.out.println("ArithmeticException,a="+a);//a=6

           return (++a);//a=7,先执行(++a),再执行finally部分代码,保存a的值,作为返回值

       }finally{

         System.out.println("finally is calleda="+a); //a=7

         a++;//a=8,可改变值,但对返回值无影响,类似于方法调用。

         System.out.println("finally is called againa="+a); //a=8

       }     

    }           

}

输出结果如下:

ArithmeticException,a=6

finally is called。a=7

finally is called again。a=8

test() is returned,a=7

0 0
原创粉丝点击