天天看點

java函數調用棧_java方法的了解、調用棧與異常處理

一、流程分支

If/else :基于boolean值的雙分支

Switch:基于數字(整數、char、byte、枚舉)、字元串

類型的多分支

Int month =5;

Switch

二、方法method

1.方法就是一個子程式

Java中方法的命名規範是駝峰命名法。

int add( int a, int b ){

int result = a + b;

return result;

}

float add( float a, float b){

float result = a + b;

return result;

}

2.方法也是有類型的

對于方法的使用者來說,傳回值就是方法的類型

對于重載來說,方法簽名就是其類型

方法簽名:方法的名字+參數類型(多個,順序嚴格的)

方法的傳回值類型不屬于簽名的一部分

//這兩個方法的方法簽名相同,是以傳的參數不知道調用哪一個方法,無法确定傳回類型。

int add( int a, int b ){

int result = a + b;

return result;

}

float add( int a, int b ){

int result = a + b;

return result;

}

簽名不同才能重載!!

Tips:

1>對于java8中的拉姆達表達式來說,方法的類型包括

傳回值類型->(參數類型)

2>方法的傳回值有一個特殊的類型void,、

沒有傳回值,也就是方法中沒有return語句

3>方法的參數傳遞時有2種傳值形式,實際是由參數的類型的性質決定的。

基本類型:按值傳遞,把值複制到方法中

引用類型:隻是傳遞對象的引用,如果在方法中改變了對象(内部屬性),就會影響這個對象

4>方法(包括面向對象)都不是必須的!方法和面向對象都是給程式設計人員使用的。是以寫代碼時,如果要定義方法,就是站在設計師的高度去完成方法的設計。

3.設計的必要性:

設計師有必要的(有利于提升品質、可維護性、效率、重用),但是設計是無止境的,适可而止。評價設計優劣的标準:簡化、不用重複(消除重複代碼)

4.提取方法,将功能隻能分散

如果一個方法代碼太多,指責太多,則表示需要對這個方法進行重構(Rafactor)。通常會使用提取方法的功能智能進行分散

IDE(Ecllipse)對此提供非常好的支援

舉例:機關轉換程式,是以的代碼都可以寫在main方法中。但是将排程職責和具體的轉換職責進行拆分,将會使程式結構更加清晰。整個程式也會更加簡單。

public ClassUnitClac{

//互動邏輯

static voidmain(String[] args){

//進行轉換排程

}

//業務邏輯

static voidc2f(Scannerscanner){

//将攝氏度轉換為華氏度

}

static voidf2c(Scannerscanner){

//将華氏度轉換為攝氏度

}

}

任何應用都由應用互動邏輯和業務邏輯2部分構成。

互動邏輯可以随意改變,而且經常會随技術和流行趨勢變化。

業務邏輯相對穩定。

互動邏輯通常圍繞UI展開。

業務員邏輯通常圍繞資料展開

具體來說就是收集資料、存儲、分析、展示資料。

Static (靜态的)方法沒有充分展現面向對象的特征。

對于static方法來說,類隻是一個盒子(容器),static方法與對象(執行個體)關系不大。

三、程式調試

通過調試可以觀察程式的執行過程和内部資料

調試是一個非常強大的能力(斷點和單步執行是由CPU和JVM聯合支援的)

通過“蟲子”圖示可以進入調試模式,如果沒有看到調試視圖,可以在右上角進行透視圖的切換

加斷點:讓程式停留在斷點的位置

單步執行:F5/F6

F5:進入方法

F6:越過方法

四、調用棧

先入後出

棧是一個隻有一個口的容器,先進入棧的會落到棧底,出棧的時候最後出。最後進入棧的,在棧頂,出棧時先出。

方法調用時,需要在記憶體中開辟一塊存儲空間做為線程棧空間

每個線程都由自己的棧

調用方法時,會在棧中壓入一個棧幀,用來存儲這個方法的參數和局部變量

方法傳回時 ,棧幀就會彈出,方法的參數和局部變量就會清除

方法調用時,調用棧不斷處于漲落之中

如果調用的層級過深,調用棧可能會溢出

因為代碼執行的速度很快,是以棧幀的生存時間很短,瞬間生滅

是以局部變量無法被外部使用

五、異常處理

程式執行時,遇到錯誤(調用棧中的錯誤)就會停止執行,如果錯誤資料不能清除掉,程式就無法恢複,最終崩潰。

而java等現代程式設計語言普遍提高了清理錯誤資料的機制

異常處理

早期的c語言沒有異常處理機制

在java中,有一類異常很特别,它們叫做受查異常

受查異常必須傳遞出去(thows)或者處理掉(try/catch),不能不管

try(){

}

當代碼執行到try時,會建立一個安全點,一旦在try中發生錯誤

JVM就會檢查并收集錯誤資訊(錯誤的原因、錯誤的位置、目前調用棧的結構等)

然後利用這些資訊建立一個Exception對象(類型取決于錯誤原因)

然後抛出(throw)這個異常對象

異常對象的傳播當異常被抛出throw之後,JVM會沿着調用棧從上往下逐幀查找try建立的安全點,直到找到一個符合條件的catch或者到達棧底(崩潰)

Catch (SomeTypeException ex){

//清理

//異常對象的使用

}

//從這裡繼續執行

異常的catch

Catch是一個比對的過程,隻有類型比對成功,才會接受(捕獲),否則繼續沿着調用棧查找。

當異常被處理後,上面的棧幀就會被清除

如果在錯誤之前打開了一個系統資源,則該資源就有可能沒有正确地關閉,所有try catch後面可以寫finally{   }

finally一定會被調用,可以用來關閉資源。

異常對象中包含的資訊可以通過異常對象提供的方法擷取到

getMessage()

getStackTrace()

printStackTracd() 可以把異常資訊列印到控制台或指定的輸出流中(儲存成檔案等)

作業:

1.畫一個調用棧來表示多層方法調用的過程

static   void main(){

double a = 3;

double b =5;

double c  = calcArc(3,5)

}

static double calcArc(double x, double y){

double m = pow(x);-+

double n = pow(y);

double 0 = m+n;

return sqrt(o);

}

2.Square類a邊長

Rectangle類a,b長寬

Circle  類r半徑

Sidelength()周長

3.畫一個異常傳播的示意圖