棧中存儲什麼?
- 每個線程都有自己的棧,棧中的數據都是以棧幀的格式存在。
- 在這個線程上正在執行的每一個方法都各自對應一個棧幀
- 棧幀是一個內存區塊,是一個數據集維繫着方法執行過程中的各種數據信息
在一條活動線程中,一個時間點上,只會有一個活動的棧幀,即只有當前正在執行的方法的棧幀(棧頂棧幀)是有效的,這個棧幀被稱爲當前棧幀(Current Frame),與當前棧幀對應的方法就是當前方法(Current method),定義這個方法的類就是當前類(Current Class)
執行引擎運行的所有字節碼指令只會針對當前棧幀進行操作
如果在該方法中調用了其他方法,對應的新的棧幀就會被創建出來,放在棧的頂端,稱爲新的當前幀
棧運行的原理:
-
不同的線程中所包含的棧幀是不允許互相之間引用的,即不可能在一個棧幀之中引用另外一個線程的棧幀。
-
如果當前方法調用了其他方法,方法返回之際,當前棧幀會傳回此方法的執行結果給前一個棧幀,接着,虛擬機會丟棄當前棧幀,使得前一個棧幀重新成爲當前棧幀。
-
Java方法由兩種返回函數的方式,一種是正常的函數返回,使用return指令;另一種是拋出異常。不管使用哪種方式,都會導致棧幀被彈出
- 當沒有使用拋出異常時,methodA的異常會返回給main方法,看main方法有沒有對應的異常處理,如果沒有則報錯並且導致System.out.println(“methodA執行完畢”);沒有執行,
- main方法使用了拋出異常之後執行結果