2014-10-06 2 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 говорит:

Оператор утверждают, что выполняется после того, как его класс закончил инициализации включена, если и только если хост-система имеет , определено, что класс верхнего уровня, который лексически содержит утверждение заявление включает утверждения.

Я думал, что разрешил утверждение утвердить true в классе Cl, но он все еще не работает. Как я могу включить утверждение относительно того, что сказал JLS?

+1

'assert enabled == true;' попробуйте это, поскольку утверждение терпит неудачу, только если логическое выражение приводит к 'false', насколько я знаю. – EpicPandaForce

ответ

5

Добавить опцию -ea в командной строке Java при запуске программы

1

запустить программу, как это,

java -ea YourClass 

-ea средства позволяют утверждение и после запуска, как это ваш утверждения будут выполняться во время выполнения, иначе они просто перескакивают утверждения assert.

Если вы используете eclipse идут для запуска конфигурации и записи -ea в VM Arguments и Run.

Если вы пытаетесь включить утверждение программно вы можете попробовать это,

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

Заметим, что как только класс был инициализирован, изменить его статус утверждения невозможно. –

2

Другие ответы объяснить, как включить утверждения. (Обратите внимание, что вы можете включать или отключать их для всех классов, для классов в данном пакете или для отдельных классов.)

Я просто хочу объяснить, что на самом деле делает assert true;.

Он не включает и не отключает утверждения. Это не то, что заявление assert означает «означает». Действительно, к моменту выполнения этого оператора было бы слишком поздно включать или отключать утверждения для C1 и, вероятно, для Bar. Утверждения могут быть включены или отключены только для класса до, класс был инициализирован. Это происходит (самое большее) один раз для любого данного класса.

Что он на самом деле делает (если утверждения разрешены ...) заключается в том, чтобы оценить выражение true и проверить, является ли оно true. Который всегда будет. Короче говоря, это не-op.

Смежные вопросы