文章标题

来源:互联网 发布:人工智能导论教学大纲 编辑:程序博客网 时间:2024/06/04 18:27

异常与异常处理


在面向对象的思想中,异常也要作为一种对象进行处理,它可以在系统中的每一层接口间传递。也可以在任意一层进行处理。

抛出异常 throw & throws

我们可以在出错的情况下直接抛出异常,并终止当前程序的执行。此时,我们一般不在当前方法中处理异常,所以,就要由方法的调用者来处理异常,在抛出异常的函数中也要根据异常的种类来声明会抛出异常的类型。

捕获异常

可能会抛出异常的代码需要放在try块中,然后它捕获的异常可以用catch块进行处理,即使没有捕获异常也可以在finally中进行必要的处理后再把异常抛出到虚拟机进行处理。
try{ } catch (Exception e) {} finally {}

代码:
public float divide(int f1, int f2) {
float res = 0;

try {     res = f1 / f2;}catch (NullPointerException e) {    System.out.println("argument error");}catch (OutOfMemoryError e) {    System.out.println("error");}finally{    System.out.println("ok");}System.out.println("end");return res;

}

基本的处理过程,可以在以下的字节码文件中看出来

  public float divide(int f1, int f2); 0  fconst_0  // 常数0 1  fstore_3 [res] //保存到res中 2  iload_1 [f1] // f1 载入到寄存器 3  iload_2 [f2] // f2 载入到寄存器 4  idiv  // 做除法,虚拟机会应该会以if (f2 ==0) throw的形式抛出异常 5  i2f  // int to float 6  fstore_3 [res] // 结果保存到res中 7  goto 56 // 跳转到56行,此处是一条jsr语句,又跳转到finally语句10  astore 4 [e]//从异常信息表,抛出的是此类型的异常时,把变量e的内容赋值到寄存器12  getstatic java.lang.System.out : java.io.PrintStream [16]//获取输出流15  ldc <String "argument error"> [22] // 把一段常量内容压栈17  invokevirtual java.io.PrintStream.println(java.lang.String):void [24]//调用输出函数20  goto 56 //jsr跳转到finally23  astore 4 [e] //从异常信息表中,如果是这种异常,跳转到这里25  getstatic java.lang.System.out : java.io.PrintStream [16]28  ldc <String "error"> [30]30  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]33  goto 56 // jsr跳转到finally36  astore 6 // 如果没有catch 到异常情况就会跳到这里了,这里面有两个隐含的变量:index 5和index 6,猜测index 6会保存41 行的地址。38  jsr 44 // 执行finally中的内容。41  aload 6 // 43  athrow44  astore 5 // 猜测,index 5变量应该是catch中是否捕捉到异常,结果是一个bool变量。把它的结果压栈。46  getstatic java.lang.System.out : java.io.PrintStream [16]// 输出OK49  ldc <String "ok"> [32]51  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]54  ret 5 // 出栈到Index 5,并根据其内容决定是否跳转到Index 6执行,也就是41行56  jsr 4459  getstatic java.lang.System.out : java.io.PrintStream [16]62  ldc <String "end"> [34]64  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]67  fload_3 [res]68  freturn  Exception Table:    [pc: 2, pc: 7] -> 10 when : java.lang.NullPointerException    [pc: 2, pc: 7] -> 23 when : java.lang.OutOfMemoryError    [pc: 2, pc: 20] -> 36 when : any    [pc: 23, pc: 33] -> 36 when : any    [pc: 56, pc: 59] -> 36 when : any

关于Index 5和Index 6 虽然是猜测的内容,不过按照已经确定的执行流程,应该不会错太多。

0 0
原创粉丝点击