都不懂怎麼拋異常,憑什麼說你會寫Java

今天當我正在享受指尖跳動的(敲代碼)律感時,忽然被一個刺耳的聲音打斷,只聽見近處傳來一聲就這????,搞的我一臉懵逼java

black.jpg

我扭頭過去發現原來這不是常常翻別人代碼看的阿祥,我不屑的對他說就這?就這代碼寫的是否是很完美?shell

只見他搖搖頭,一個方法throw這多麼異常,可是你知道這些異常存儲在哪裏(面帶驕傲,賭我不知道),可是他殊不知道我剛剛看完Class類文件。我輕蔑的跟他說小老弟,走找個會議室我跟你說道說道。因而我帶着個人神獸(Macbook Pro)和阿祥來到了光明頂會議室。微信

我:阿祥再看一下這段代碼,是否是很完美(兄弟們別當真,這個只是個示例,認真你就輸了)spa

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();
    }
}

阿祥:你繼續,我看你怎麼秀3d

我:敲出了下面兩行命令code

編譯Java文件
javac -g:none ClassTest.java
javap -v ClassTest.class

只見個人神獸吐出來張藏寶圖,爲了不你們去挖礦,只展現部份內容(dissXiang方法的Exception屬性)以下:blog

WX20210105-212936@2x.png

我:小老弟,看到紅框中地方了麼,平時咱們方法throws的異常就藏在Excption屬性中,下面豎起耳朵聽了,我給你好好說說這個Exception屬性索引

Exception屬性的做用是列舉出方法中可能拋出的受查異常,Exception屬性結構以下:rem

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

相關文章
相關標籤/搜索