java方法的理解、調用棧與異常處理

1、流程分支

   If/else :基於boolean值的雙分支java

   Switch:基於數字(整數、charbyte、枚舉)、字符串編程

     類型的多分支安全

 

Int month =5;編程語言

Switchide

2、方法method

1.方法就是一個子程序

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

   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)。一般會使用提取方法的功能智能進行分散

IDEEcllipse)對此提供很是好的支持

舉例:單位轉換程序,因此的代碼均可以寫在main方法中。可是將調度職責和具體的轉換職責進行拆分,將會使程序結構更加清晰。整個程序也會更加簡單。

 

public Class UnitClac{

      

    //交互邏輯

      static void main(String[] args){

        //進行轉換調度

}

 

       //業務邏輯

static void c2f(Scannerscanner){

  //將攝氏度轉換爲華氏度

}

 

static void f2c(Scannerscanner){

  //將華氏度轉換爲攝氏度

}

}

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

      交互邏輯能夠隨意改變,並且常常會隨技術和流行趨勢變化。

      業務邏輯相對穩定。

      交互邏輯一般圍繞UI展開。

      業務員邏輯一般圍繞數據展開

             具體來講就是收集數據、存儲、分析、展現數據

 

Static (靜態的)方法沒有充分體現面向對象的特徵。

對於static方法來講,類只是一個盒子(容器),static方法與對象(實例)關係不大。

3、程序調試

   經過調試能夠觀察程序的執行過程和內部數據

   調試是一個很是強大的能力(斷點和單步執行是由CPUJVM聯合支持的)

經過「蟲子」圖標能夠進入調試模式,若是沒有看到調試視圖,能夠在右上角進行透視圖的切換

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

    單步執行:F5/F6

F5:進入方法

F6:越過方法

4、調用棧

    先入後出

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

方法調用時,須要在內存中開闢一塊存儲空間作爲線程棧空間

 每一個線程都由本身的棧

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

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

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

若是調用的層級過深,調用棧可能會溢出

 

由於代碼執行的速度很快,因此棧幀的生存時間很短,瞬間生滅

  因此局部變量沒法被外部使用

5、異常處理

程序執行時,遇到錯誤(調用棧中的錯誤)就會中止執行,若是錯誤數據不能清除掉,程序就沒法恢復,最終崩潰。

而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.Squarea邊長

      Rectangle類    ab長寬

      Circle  類     r半徑

      Sidelength()周長

 

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

相關文章
相關標籤/搜索