今天當我正在享受指尖跳動的(敲代碼)律感時,忽然被一個刺耳的聲音打斷,只聽見近處傳來一聲就這????,搞的我一臉懵逼java
我扭頭過去發現原來這不是常常翻別人代碼看的阿祥,我不屑的對他說就這?就這代碼寫的是否是很完美?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
我:小老弟,看到紅框中地方了麼,平時咱們方法throws的異常就藏在Excption屬性中,下面豎起耳朵聽了,我給你好好說說這個Exception屬性索引
Exception屬性的做用是列舉出方法中可能拋出的受查異常,Exception屬性結構以下:rem
我:阿祥attribute_name_index和attribute_length你不懂的話就去我公衆號看文章,這裏就不給你說了,我直接說和Execption相關的兩個字段源碼
阿祥:能夠的,很好理解,那你運行一下你的程序吧
我:能夠,沒問題
運行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因爲是屬性的通用字段這裏不說了
圖上的LineNumberTable是Java源碼的第8行對應dissXiang方法的Code屬性中Code字段的字節碼偏移量
我:阿祥,都清楚了吧
阿祥:不錯不錯,還有別的屬性麼?
我:屬性在字節碼文件還有不少,後面我再陸續給你展現,你先消化消化今天這兩個屬性吧
我是shysh95,但願能夠和你專一技術的路上並肩做戰,咱們下期再見!!!掃碼關注微信公衆號,更多精彩文章!!!