JAVA异常处理机制

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++;

         return a;

            

       } 

       catch (ArithmeticException e) { // 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值