5

都不懂怎么抛异常,凭什么说你会写Java

 3 years ago
source link: https://segmentfault.com/a/1190000038836001
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

都不懂怎么抛异常,凭什么说你会写Java

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

black.jpg

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

只见他摇摇头,一个方法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属性)如下:

WX20210105-212936@2x.png

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

Exception属性的作用是列举出方法中可能抛出的受查异常,Exception属性结构如下:

WX20210105-214732@2x.png

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

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

阿祥:可以的,很好理解,那你运行一下你的程序吧

我:可以,没问题

运行Class文件
java ClassTest

WX20210105-215551@2x.png

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

我:我故意不想显示行号的(实际中强烈不建议这样做,除非你想作死给自己找罪受),下面我再给说道说道另一个属性那就是LineNumberTable

阿祥:快说快说,知道啥都快show出来

我:知道为什么异常不显示行号么,是因为我在编译Java文件中加入了-g:none参数,这个参数会阻止LineNumberTable属性的生成,下面我就给你详细说说这个属性。

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

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

WX20210105-221237@2x.png

从上图可以看出,LineNumberTable是作用在Code属性,关于Code属性不懂也可以去公众号上看,LineNumberTable的结构如下:

WX20210105-221610@2x.png

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,希望可以和你专注技术的路上并肩作战,我们下期再见!!!扫码关注微信公众号,更多精彩文章!!!
qrcode_for_gh_1706f00849c9_344.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK