异常

由之前月份处理修改的例子

//清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Exception {private int index;public IncorrectMonthException(int index) {this.index = index;}public int getIndex() {return index;}}

//清单2Month2.javaclass Month2 {public static String[] months = { "January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December" };public static String get_month(int i) throws IncorrectMonthException {if (i  11)throw new IncorrectMonthException(i);return months[i];};public static void main(String[] args) {try {System.out.println(get_month(100));} catch (IncorrectMonthException e) {System.out.println("incorrect month index: " + e.getIndex());e.printStackTrace();}};}

编译javac Month2.java

只写一个Month2.java,这里是IncorrectMonthException.java也会自动编译

反编译javap -c -verbose Month2.classjavap -c -verbose IncorrectMonthException.class

IncorrectMonthException方法public IncorrectMonthException(int);    descriptor: (I)V    flags: ACC_PUBLIC    Code:      stack=2, locals=2, args_size=2         0: aload_0         1: invokespecial #1                  // Method java/lang/Exception."":()V         4: aload_0         5: iload_1         6: putfield      #2                  // Field index:I         9: return

本质上,IncorrectMonthException类只是做了对象构造,还有访问器方法。IncorrectMonthException类是继承于Exception类,所以,IncorrectMonthException类构造之前,构造父类Exception,然后传递整数给IncorrectMonthException类作为唯一的属性值

getIndex方法public int getIndex();    descriptor: ()I    flags: ACC_PUBLIC    Code:      stack=1, locals=1, args_size=1         0: aload_0         1: getfield      #2                  // Field index:I         4: ireturn

getIndex()只是一个访问器,引用到IncorrectMonthException类,被传到局部变量的索引值0的位置(this指针),用aload_0指令取得, 用getfield指令取得对象的整数值,用ireturn指令将其返回。

再看Month2.class的get_month方法public static java.lang.String get_month(int) throws IncorrectMonthException;    descriptor: (I)Ljava/lang/String;    flags: ACC_PUBLIC, ACC_STATIC    Code:      stack=3, locals=1, args_size=1         0: iload_0         1: iflt          10         4: iload_0         5: bipush        11         7: if_icmple     19        10: new           #2                  // class IncorrectMonthException        13: dup        14: iload_0        15: invokespecial #3                  // Method IncorrectMonthException."":(I)V        18: athrow        19: getstatic     #4                  // Field months:[Ljava/lang/String;        22: iload_0        23: aaload        24: areturn

部分指令解释

0: iload_0 //第0个变量(即变量i)压入操作数栈

1: iflt 10 //当栈顶int型数值小于0时跳转到偏移块10(这里是从栈顶弹出一个值进行比较)

4: iload_0 //第0个变量(即变量i)压入操作数栈

5: bipush 11 //将11压入操作数栈

7: if_icmple 19 //会从栈中弹出两个值进行比较,如果第二个(变量i)小于或者等于第一个(数字11),那么跳转到偏移位19

10: new #2 // class IncorrectMonthException //创建IncorrectMonthException对象的引用并压入栈顶

13: dup //复制栈顶值压入栈顶

14: iload_0 //第0个变量(即变量i)压入操作数栈

15: invokespecial #3 // Method IncorrectMonthException."":(I)V //调用IncorrectMonthException的""方法,这里需要从栈顶弹出两个值,1是IncorrectMonthException对象的引用,2是变量i

18: athrow //将栈顶的异常抛出

19: getstatic #4 // Field months:[Ljava/lang/String; //获取静态成员months数组的引用压入栈

22: iload_0 //第0个变量(即变量i)压入操作数栈

23: aaload //栈顶弹出两个值,将引用型数组指定索引的值推送至栈顶,这里索引i为第一个弹出值,数组引用months为第二个弹出值,即months[i]的值送入栈顶

24: areturn //返回栈顶值

Month2.class的main方法public static void main(java.lang.String[]);    descriptor: ([Ljava/lang/String;)V    flags: ACC_PUBLIC, ACC_STATIC    Code:      stack=3, locals=2, args_size=1         0: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;         3: bipush        100         5: invokestatic  #6                  // Method get_month:(I)Ljava/lang/String;         8: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V        11: goto          47        14: astore_1        15: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;        18: new           #8                  // class java/lang/StringBuilder        21: dup        22: invokespecial #9                  // Method java/lang/StringBuilder."":()V        25: ldc           #10                 // String incorrect month index:        27: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;        30: aload_1        31: invokevirtual #12                 // Method IncorrectMonthException.getIndex:()I        34: invokevirtual #13                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;        37: invokevirtual #14                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;        40: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V        43: aload_1        44: invokevirtual #15                 // Method IncorrectMonthException.printStackTrace:()V        47: return      Exception table:         from    to  target type             0    11    14   Class IncorrectMonthException

注意Exception table:文字以及下面的表数据

异常表的第一行数据表示从0到11行若发生异常,则跳转到偏移块14的位置,同时也指明异常的类型为IncorrectMonthException类

异常从偏移块14开始执行,如果没有这个异常表的数据,则偏移块14后的指令不会被执行

这有个例子,IDA是如何显示异常表:

原作者用的自己电脑里的random.class,这里用刚才的Month2.class替代.catch IncorrectMonthException from met003_begin to met003_11 using \met003_14

java逆向_Java逆向基础之异常相关推荐

  1. java厨房_Java多线程基础

    目录: 进程和线程 为什么使用多线程? 多线程的创建方式 Runnable与Thread两种方式比较 start()与run()方法 线程的生命周期/状态转换 常用方法使用与解读 线程的优先级 守护线 ...

  2. java 考试题_JAVA语言基础内部测试题(50道选择题)

    JAVA语言基础内部测试题 选择题(针对以下题目,请选择最符合题目要求的答案,针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分.)(每题2分) 没有注明选择几项 ...

  3. 0基础java语法_Java零基础教程(二)基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  4. java 国际化_Java国际化基础

    关于本教程 本教程是关于什么的? 本教程向您介绍Java编程语言对多语言和多国家/地区环境的支持. 本课程首先对国际化原则和概念进行一般性讨论,然后继续对Java国际化支持的特定领域进行概述. 最后几 ...

  5. java 二进制运算_java二进制运算基础知识点详解|chu

    一.二进制位运算 1. 按位与(&) 位运算实质是将参与运算的数字转换为二进制,而后逐位对应进行运算. 按位与运算为:两位全为1,结果为1,即1&1=1,1&0=0,0& ...

  6. 实例化Java对象_Java面向对象基础之对象实例化

    1.实例化对象的过程可以分为两部分,例如下面代码: Person per = new Person(); 该代码分为两部分: 第一,声明对象:Person per,这部分是在栈内存中声明的,与数组一样 ...

  7. 递归java程序_JAVA编程基础之递归结构

    递归结构 递归是一种常见的解决问题的方法,即把问题逐渐简单化. 递归的基本思想就是 自己调用自己 ",一个使用递归技术的方法将会直接或者间接的调用自己.利用递归可以用简单的程序来解决一些复杂 ...

  8. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  9. java 抛出异常的作用_Java 基础之异常抛出

    Java 基础之异常抛出 Java,基础,异常抛出 在 Java 里,除了对异常的捕获外,你还可以抛出异常,还可以创造异常.抛出异常的作用就是告诉你的调用者,程序出现了不正常的情况了,得不要期望的结果 ...

最新文章

  1. Socket程序从windows移植到linux下需要注意的
  2. nodeJs多线程 -- 学习记录
  3. C++ 用vector创建数组对象
  4. C++程序设计之保存和读取二进制文件
  5. 成功解决PermissionError: [Errno 13] Permission denied: './data\\mnist\\train-images-idx3-ubyte'
  6. Docker启动失败 提示An error occurred和乱码
  7. 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
  8. 计算机系统中存储管理是,《计算机操作系统5、存储管理.doc
  9. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
  10. python的变量的命名规则以及定义
  11. 零基础可上手 | 手把手教你用Cloud AutoML做毒蜘蛛分类器
  12. 挑战性题目DSCT301:求不同形态的二叉树数目
  13. 服务器操作系统详解,深入解析Windows操作系统之总体架构
  14. sd 0:0:0:0: [sda] Assuming drive cache: write through错误解决 本人实测!
  15. 【CV】斯坦福CS231n DL-CV by李飞飞 team
  16. Whitestorm.js入门
  17. TunesKit Video Cutter for Mac(视频分割编辑工具)
  18. Bluemix平台打造DC/OS云计算平台(一)
  19. 【BSP视频教程】STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较
  20. 基于色温估计的白平衡算法

热门文章

  1. C++ 指针基本概念
  2. Twitter创始人Jack Dorsey的每日必做和不做清单
  3. html图像特征提取,图像识别之图像特征提取
  4. Matlab非线性拟合工具箱cftool
  5. 牛客网-数据结构笔试题目(七)-k-amazing数字求解
  6. java服务器崩溃的原因_请求大神帮忙分析一下服务器崩溃原因
  7. java开发一个完整的秒杀与竞价网上商城
  8. python合并数组输出重复项_python - 不同数组项的所有可能组合[重复] - 堆栈内存溢出...
  9. 渗透测试-验证码的爆破与绕过
  10. 4阶范德蒙德行列式例题_行列式的性质和计算问题