乐趣区

关于java:都不懂怎么抛异常凭什么说你会写Java

明天当我正在享受指尖跳动的 (敲代码) 律感时,忽然被一个刺耳的声音打断,只听见近处传来一声 就这????,搞的我一脸懵逼

我扭头过来发现原来这不是常常翻他人代码看的阿祥,我不屑的对他说就这?就这代码写的是不是很完满?

只见他摇摇头,一个办法 throw 这如许异样,然而你晓得这些异样存储在哪里 (面带自豪,赌我不晓得),然而他却不晓得我刚刚看完 Class 类文件。我轻蔑的跟他说小老弟,走找个会议室我跟你说道说道。于是我带着我的神兽(Macbook Pro) 和阿祥来到了光明顶会议室。

我:阿祥再看一下这段代码,是不是很完满(兄弟们别当真,这个只是个示例,认真你就输了)

public class ClassTest {

    private Integer number;

    public int dissXiang() throws NullPointerException, IllegalArgumentException {return number.intValue();
    }

    public static void main(String[] args) {ClassTest test = new ClassTest();
        test.dissXiang();}
}

阿祥:你持续,我看你怎么秀

我:敲出了上面两行命令

编译 Java 文件
javac -g:none ClassTest.java
javap -v ClassTest.class 

只见我的神兽吐出来张藏宝图,为了防止大家去挖矿,只展现局部内容 (dissXiang 办法的 Exception 属性) 如下:

我:小老弟,看到红框中中央了么,平时咱们办法 throws 的异样就藏在 Excption 属性中,上面竖起耳朵听了,我给你好好说说这个 Exception 属性

Exception 属性的作用是列举出办法中可能抛出的受查异样,Exception 属性构造如下:

我:阿祥 attribute_name_index 和 attribute_length 你不懂的话就去我公众号看文章,这里就不给你说了,我间接说和 Execption 相干的两个字段

  • number_of_exceptions:异样的个数
  • exception_index_table:指向常量池 CONSTANT_Class_info 的索引,代表了异样的类型

阿祥:能够的,很好了解,那你运行一下你的程序吧

我:能够,没问题

运行 Class 文件
java ClassTest

阿祥:你这代码也太烂了吧,抛异样就抛异样吧,为啥你的异样都不显示代码的行号

我:我成心不想显示行号的(理论中强烈不倡议这样做,除非你想作死给本人找罪受),上面我再给说道说道另一个属性那就是LineNumberTable

阿祥:快说快说,晓得啥都快 show 进去

我:晓得为什么异样不显示行号么,是因为我在编译 Java 文件中退出了 -g:none 参数,这个参数会阻止 LineNumberTable 属性的生成,上面我就给你具体说说这个属性。

LineNumberTable属性是用于形容 Java 源码行号和与字节码行号 (字节码偏移量) 之间的对应关系

批改编译参数为 -g:lines,或者省略 - g 参数都会生成 LineNumberTable 属性
javac -g:lines ClassTest.java
javap -v ClassTest.class 

从上图能够看出,LineNumberTable 是作用在 Code 属性,对于 Code 属性不懂也能够去公众号上看,LineNumberTable 的构造如下:

attribute_name_index 和 attribute_length 因为是属性的通用字段这里不说了

  • line_number_table_length:line_number_table 的数量
  • line_number_table:蕴含了 u2 的 start_pc(字节码行号)和 line_number(Java 源码行号)

图上的 LineNumberTable 是 Java 源码的第 8 行对应 dissXiang 办法的 Code 属性中 Code 字段的字节码偏移量

我:阿祥,都分明了吧

阿祥:不错不错,还有别的属性么?

我:属性在字节码文件还有很多,前面我再陆续给你展现,你先消化消化明天这两个属性吧

我是 shysh95,心愿能够和你专一技术的路上并肩作战,咱们下期再见!!!扫码关注微信公众号,更多精彩文章!!!

退出移动版