2014-10-06 59 views
1

我已經寫了下面的代碼:如何啓用assert語句來執行?

class Cl 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     assert true; //1 
     Bar.foo(); 
    } 

    static class Bar{ 
     public static void foo(){ 
      boolean enabled = false; 
      assert enabled = true; 
      System.out.println("Asserts " + 
       (enabled ? "enabled" : "disabled")); 
     } 
    } 
} 

DEMO

JLS 14.10說:

這是它的後級執行的斷言語句完成 如果初始化並啓用只有當主系統有 確定在詞彙上包含的頂級類別斷言 陳述啓用斷言。

我以爲我通過在Cl類中聲明爲true來激活斷言,但它仍然不起作用。我怎樣才能啓用一個關於JLS說什麼的斷言?

+1

'assert enabled == true;'試一下,只要邏輯語句的結果爲'false',斷言就會失敗,據我所知。 – EpicPandaForce 2014-10-06 13:45:30

回答

5

-ea選項添加到您的java命令行,當你運行你的程序

1

運行這樣你的程序,

java -ea YourClass 

-ea手段啓用斷言和運行這樣的後斷言將在運行時執行,否則它只會跳轉斷言語句。

如果您正在使用eclipse去跑構造和VM Arguments和運行寫-ea

如果你試圖啓用斷言編程,你可以試試這個,

 boolean enabled = false; 
    ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
    assert enabled = true; 
    System.out.println("Asserts " + 
     (enabled ? "enabled" : "disabled")); 
+1

但請注意,一旦一個類被初始化,就不可能改變它的斷言狀態。 – 2014-10-06 14:26:06

2

其他的答案解釋如何啓用斷言。 (請注意,您可以爲所有類,給定包中的類或單個類啓用或禁用它們。)

我只是想解釋assert true;實際上做了什麼。

它不啓用或禁用聲明。這不是什麼assert聲明「意味着」。事實上,在執行該語句時,啓用或禁用對C1以及可能對Bar的斷言都爲時已晚。斷言只能在之前爲類啓用或禁用,該類已被初始化。對於任何給定的課程,最多發生一次。

它實際上做了什麼(如果聲明啓用...)是評估表達式true並測試它是否爲true。它總是會是。總之,這是一個沒有操作。