1. 程式人生 > 其它 >都不懂怎麼拋異常,憑什麼說你會寫Java

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

技術標籤:程式設計師JAVA面試java程式語言jvmspring後端

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

都不懂怎麼拋異常,憑什麼說你會寫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屬性)如下:

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

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

Exception屬性的作用是列舉出方法中可能丟擲的受查異常,Exception屬性結構如下:

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

我:阿祥attribute_name_index和attribute_length你不懂的話就去我公眾號看文章,這裡就不給你說了,我直接說和Execption相關的兩個欄位

  • number_of_exceptions:異常的個數
  • exception_index_table:指向常量池CONSTANT_Class_info的索引,代表了異常的型別

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

我:可以,沒問題

執行Class檔案
java ClassTest

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

阿祥:你這程式碼也太爛了吧,拋異常就拋異常吧,為啥你的異常都不顯示程式碼的行號

我:我故意不想顯示行號的(實際中強烈不建議這樣做,除非你想作死給自己找罪受),下面我再給說道說道另一個屬性那就是LineNumberTable

阿祥:快說快說,知道啥都快show出來

我:知道為什麼異常不顯示行號麼,是因為我在編譯Java檔案中加入了-g:none引數,這個引數會阻止LineNumberTable屬性的生成,下面我就給你詳細說說這個屬性。

LineNumberTable屬性是用於描述Java原始碼行號和與位元組碼行號(位元組碼偏移量)之間的對應關係

修改編譯引數為-g:lines,或者省略-g引數都會生成LineNumberTable屬性
javac -g:lines ClassTest.java
javap -v ClassTest.class

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

從上圖可以看出,LineNumberTable是作用在Code屬性,LineNumberTable的結構如下:

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

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欄位的位元組碼偏移量

我:阿祥,都清楚了吧

阿祥:不錯不錯,還有別的屬性麼?

我:屬性在位元組碼檔案還有很多,後面我再陸續給你展示,你先消化消化今天這兩個屬性吧