文章标题
来源:互联网 发布:人工智能导论教学大纲 编辑:程序博客网 时间: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
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- Visual Studio 保存布局等个人习惯
- 大数阶乘
- 排序15:有序矩阵查找
- MATLAB画图函数plot简单用法
- 第十一周:( LeetCode474) Ones and Zeroes(c++)
- 文章标题
- 排序16:最短子数组
- 清除浮动方法
- PHP程序员的技术成长规划
- HDU
- C# MemoryStream类小结 (学习日记 2017-04-29)
- 虚函数中静态类型与动态类型
- 服务器开发过程中关于计时器的处理
- CentOS7之LVM实战