1. 程式人生 > 其它 >java基礎(四)

java基礎(四)

1.36 遇到過異常嗎,如何處理?

在Java中,可以按照如下三個步驟處理異常:

  1. 捕獲異常

    將業務程式碼包裹在try塊內部,當業務程式碼中發生任何異常時,系統都會為此異常建立一個異常物件。建立異常物件之後,JVM會在try塊之後尋找可以處理它的catch塊,並將異常物件交給這個catch塊處理。

  2. 處理異常

    在catch塊中處理異常時,應該先記錄日誌,便於以後追溯這個異常。然後根據異常的型別、結合當前的業務情況,進行相應的處理。比如,給變數賦予一個預設值、直接返回空值、向外丟擲一個新的業務異常交給呼叫者處理,等等。

  3. 回收資源

    如果業務程式碼打開了某個資源,比如資料庫連線、網路連線、磁碟檔案等,則需要在這段業務程式碼執行完畢後關閉這項資源。並且,無論是否發生異常,都要嘗試關閉這項資源。將關閉資源的程式碼寫在finally塊內,可以滿足這種需求,即無論是否發生異常,finally塊內的程式碼總會被執行。

1.37 說一說Java的異常機制

參考答案

關於異常處理:

      在Java中,處理異常的語句由try、catch、finally三部分組成。其中,try塊用於包裹業務程式碼,catch塊用於捕獲並處理某個型別的異常,finally塊則用於回收資源。當業務程式碼發生異常時,系統會建立一個異常物件,然後由JVM尋找可以處理這個異常的catch塊,並將異常物件交給這個catch塊處理。若業務程式碼打開了某項資源,則可以在finally塊中關閉這項資源,因為無論是否發生異常,finally塊一定會執行。

關於丟擲異常:

       當程式出現錯誤時,系統會自動丟擲異常。除此以外,Java也允許程式主動丟擲異常。當業務程式碼中,判斷某項錯誤的條件成立時,可以使用throw關鍵字向外丟擲異常。在這種情況下,如果當前方法不知道該如何處理這個異常,可以在方法簽名上通過throws關鍵字宣告丟擲異常,則該異常將交給JVM處理。

關於異常跟蹤棧:

       程式執行時,經常會發生一系列方法呼叫,從而形成方法呼叫棧。異常機制會導致異常在這些方法之間傳播,而異常傳播的順序與方法的呼叫相反。異常從發生異常的方法向外傳播,首先傳給該方法的呼叫者,再傳給上層呼叫者,以此類推。最終會傳到main方法,若依然沒有得到處理,則JVM會終止程式,並列印異常跟蹤棧的資訊

1.38 請介紹Java的異常介面

  • Throwable是異常的頂層父類,它由兩個直接子類error和,exception
  • error是與jvm相關的問題
  • exception又分為編譯時異常和執行時異常,編譯時異常是提醒你這個地方可能會出錯,而執行時異常則可能是由於程式設計師邏輯不嚴謹引起的

1.39 finally是無條件執行的嗎?

不管try塊中的程式碼是否出現異常,也不管哪一個catch塊被執行,甚至在try塊或catch塊中執行了return語句,finally塊總會被執行。

1.40 在finally中return會發生什麼?

參考答案

在通常情況下,不要在finally塊中使用return、throw等導致方法終止的語句,一旦在finally塊中使用了return、throw語句,將會導致try塊、catch塊中的return、throw語句失效。

1.41 說一說你對static關鍵字的理解

  • java類中包含成員變數,構造器,程式碼塊,方法,內部類5種成員,static可以修飾成員變數,程式碼塊,方法及內部類
  • 被static修飾的成員是類成員,屬於整個類,不屬於某個例項
  • 類成員不能訪問例項成員,因為類成員在類載入的時就初始化,例項成員在建立一個例項時才初始化

1.42 static修飾的類能不能被繼承?

參考答案

static修飾的類可以被繼承。

擴充套件閱讀

如果使用static來修飾一個內部類,則這個內部類就屬於外部類本身,而不屬於外部類的某個物件。因此使用static修飾的內部類被稱為類內部類,有的地方也稱為靜態內部類。

static關鍵字的作用是把類的成員變成類相關,而不是例項相關,即static修飾的成員屬於整個類,而不屬於單個物件。外部類的上一級程式單元是包,所以不可使用static修飾;而內部類的上一級程式單元是外部類,使用static修飾可以將內部類變成外部類相關,而不是外部類例項相關。因此static關鍵字不可修飾外部類,但可修飾內部類。

靜態內部類需滿足如下規則:

  1. 靜態內部類可以包含靜態成員,也可以包含非靜態成員;

  2. 靜態內部類不能訪問外部類的例項成員,只能訪問它的靜態成員;

  3. 外部類的所有方法、初始化塊都能訪問其內部定義的靜態內部類;

  4. 在外部類的外部,也可以例項化靜態內部類,語法:外部類.內部類 變數名 = new 外部類.內部類構造方法()

1.43 static和final有什麼區別?

static關鍵字可以修飾成員變數、成員方法、初始化塊、內部類,被static修飾的成員是類的成員,它屬於類、不屬於單個物件。以下是static修飾這4種成員時表現出的特徵:

  • 類變數:被static修飾的變數稱為類變數(靜態變數),它隨類的資訊存在於方法區,建議通過類名訪問
  • 類方法:被static修飾的方法(靜態方法),類方法屬於類,建議通過類名訪問
  • 靜態塊:被static修飾的程式碼塊叫做靜態初始化塊,在類載入時呼叫一次,之後便不會呼叫了
  • 靜態內部類:被static修飾的內部類叫靜態內部類。靜態內部類不能訪問外部類的例項成員,只能訪問外部類的靜態成員。外部類的所有方法、初始化塊都能訪問其內部定義的靜態內部類。

final關鍵字可以修飾類,成員變數,方法

  • final修飾的類不能被繼承
  • final修飾的方法不能被重寫
  • final修飾的變數一旦初始化便不能在被修改

1.44 說一說你對泛型的理解

  • 泛型可以在編譯階段約束操作的資料型別,避免了執行時可能出現的強制型別轉換異常
  • 泛型只能支援引用型別
  • 泛型可以在類,方法,介面上定義

1.45 介紹一下泛型擦除

泛型只在編譯時約束操作的資料型別,在編譯成位元組碼檔案進入執行階段時都會轉換成真實資料型別,相當於泛型被擦除了

反射是作用在執行時的技術,可以繞過編譯階段為集合新增任意型別的資料

可以把一個具有泛型資訊的List可以直接賦給另一個沒有泛型資訊的List

1.46 List<? super T>和List<? extends T>有什麼區別?

  • ? 是型別萬用字元,List<?> 可以表示各種泛型List的父類,意思是元素型別未知的List;

  • List<? super T> 用於設定型別萬用字元的下限,此處 ? 代表一個未知的型別,但它必須是T的父型別;

  • List<? extends T> 用於設定型別萬用字元的上限,此處 ? 代表一個未知的型別,但它必須是T的子型別。

1.47 說一說你對Java反射機制的理解

  • 反射是指對於任何一個Calss類,在“執行的時候”都可以得到這個類的全部成分
  • 在執行時可以得到這個類的構造器,成員變數,成員方法
  • 這種執行時動態獲取類資訊以及動態呼叫類種成分的能力的機制叫做反射
  • 核心和關鍵就是得到編譯以後的class檔案物件

1.48 Java反射在實際專案中有哪些應用場景?

  • 面向切面程式設計(AOP)的實現方案,是在程式執行時建立目標物件的代理類,這必須由反射機制來實現。