常見問題

問題:什麼原因會導致一行成為部分涵蓋(顯示黃色指示器)?

回答:如果沒有執行程式碼中的所有分支,則會指出一行為部分涵蓋。

下面是幾個範例:

  1. 異常狀況處理程式:

  2. try {
    methodA() // methodA throws Exception
    } catch (Exception e) {..}

    呼叫 methodA 的行就是部分涵蓋,因為有兩個路徑:不是擲出並捕捉到異常狀況,就是未擲出異常狀況且程式正常執行。在未擲出異常狀況的情況下, 會指出部分涵蓋面,因為 catch 部分永遠不會執行。

  3. 共用的建構子程式碼:
  4. 在上面的範例中,行 4 被標示為部分涵蓋。請注意,無論是使用哪一個建構子來建立物件實例,都一律會執行實例變數起始設定碼。編譯器會同時在兩個建構子中放入起始設定碼。因此上述程式碼大約相等於:

    由於我們僅使用一個建構子,因此並沒有執行另一個執行路徑,也就指出部分涵蓋面。

問題:在程式碼涵蓋面報告中,所報告的套件總行數為何不一定等於該套件中顯示的類別總數?

回答:我們在報告套件中的總行數時會排除在不同方法之間共用的所有行,因此那些行不會重複計數。

問題:類別定義(例如 public class Foo {..})為何被指出為未涵蓋(紅色)或部分涵蓋(黃色)?

回答:如果類別沒有明確的預設建構子,編譯器則會自行產生一個,由於產生的建構子是隱含的,因此可能與該程式碼行相關聯。其次,如果您有任何靜態起始設定碼(例如靜態欄位),編譯器則會產生靜態起始設定區塊,這些區塊也可能與該行相關聯。

問題:為何即使涵蓋的百分比超過可接受的涵蓋面層次,套件瀏覽器中的涵蓋面指示器仍顯示為紅色?

回答:設定多個接受準則(例如,方法與區塊)時,如果不符合其中任何一個準則,則指示器就會顯示為紅色。選取程式碼涵蓋面內容,然後啟用指示器和百分比,即可設定接受準則。選取程式碼涵蓋面喜好設定,然後啟用指示器(方法、區塊等等),即可設定顯示的涵蓋面指示器。 顏色將取決於使用「內容」頁而非「喜好設定」頁所設定的準則。

問題:什麼行不計入程式碼涵蓋面?

回答:下列各行不計為已涵蓋、未涵蓋或部分涵蓋,也不用來計算涵蓋的百分比:

問題:區塊涵蓋面中的區塊意指為何?

回答:執行檔單位是從每個基本區塊的起頭開始,且又從原始碼行號與前一個位元組碼不同的每個位元組碼開始。基本區塊是一個位元組碼指令區域,既不能從其中分支出來,也不能分支到其中執行。基本區塊中的第一個指令執行時,會一併執行所有的指令,因此這些指令會被視為單一群組。

基本區塊以諸如 branch、call、throw 和 return 之類的指令而結束。

問題:對啟用了程式碼涵蓋面的應用程式進行除錯時,為何除錯器會進入 llc_probe.class 而非預期的方法?

回答:這是由於程式碼涵蓋面資料收集方式的原因。若要避免發生這個問題,您需要使用逐行過濾器: