2012-07-11 84 views
1

因此,我在調用Netbeans Java應用程序時發現,在assert函數中使用函數調用時,您不能在該函數內命中斷點或進入該函數。Java - 在斷言中調用函數時無法進入函數

起初,我認爲它必須做一些與使用重寫函數和我的重寫函數沒有被調用,但我確認這不是正在發生的事情。它仍然被調用,但不能被介入。

這裏是我試過的片段:

public class Example 
{ 
    public static boolean blah() 
    { 
     System.out.println("Executing"); //**Breakpoint here 
     return true; 
    } 

    public static void main(String[] args) 
    { 
     assert(blah()); //Cannot step into or hit breakpoint on this line. 
     blah();   //Can here. 
    } 
} 

任何人有任何想法,爲什麼這是不工作?

回答

5

默認情況下,斷言在運行時被禁用。

也許你的調試JVM沒有啓用斷言。

要啓用斷言,請爲您的NetBeans調試JVM參數指定-enableassertions(或 - ea)開關。即使斷言被編譯成字節碼,它們也不會在沒有這個開關的情況下執行。

this link更多

+0

因此,如果斷言是錯誤的,那麼它就無所謂了(好像它不在那裏)? 即使在我自己的例子中,我看到「執行」甚至沒有被打印出來。哈,謝謝。 (原始代碼更是因此沒有意識到它根本沒有運行) 再次感謝。 – aitee 2012-07-11 20:00:38

2

也許,只是也許,每個assert聲明都在這個構建中進行了優化?你確定你的打印語句被執行兩次嗎?

assert的全部意義在於,您可以告訴編譯器在您想要優化代碼時忽略內部的內容。

+0

出於好奇,爲什麼你認爲呢?'blah'方法不只是一個',而(假)'或'而(真)'pseudomethod通過優化出編譯器(假設啓用了斷言) – Cratylus 2012-07-11 19:48:29

+0

不,它沒有被打印兩次,我的錯誤是遷移到一個簡單的例子。 xD – aitee 2012-07-11 20:02:54