Java утверждать неприятный побочный эффект - ошибка компилятора? - PullRequest
4 голосов
/ 17 февраля 2010

Это

public class test 
{
    public static void main(String[] args) 
    {
        Object o = null;
        assert o != null;
        if(o != null)
          System.out.println("o != null");
    }
}

печатает "o! = Null"; 1.5_22 и 1.6_18. Ошибка компилятора? Комментирование assert исправляет это. Байт-код появляется, чтобы перейти непосредственно к оператору печати, когда утверждения отключены:

 public static main(String[]) : void
   L0
    LINENUMBER 5 L0
    ACONST_NULL
    ASTORE 1
   L1
    LINENUMBER 6 L1
    GETSTATIC test.$assertionsDisabled : boolean
    IFNE L2
    ALOAD 1: o
    IFNONNULL L2
    NEW AssertionError
    DUP
    INVOKESPECIAL AssertionError.<init>() : void
    ATHROW
   L2
    LINENUMBER 8 L2
    GETSTATIC System.out : PrintStream
    LDC "o != null"
    INVOKEVIRTUAL PrintStream.println(String) : void
   L3
    LINENUMBER 9 L3
    RETURN
   L4

Ответы [ 3 ]

1 голос
/ 29 марта 2010

Утверждения могут быть включены и отключены во время выполнения. Если вы выполняете свой код с ключом -ea (для включения утверждений), assert должен работать:

java -ea my.class
1 голос
/ 17 февраля 2010

Я не знаю про "противный". Можете ли вы привести реальный пример какого-то кода, который вас кусал? Ваш пример выглядит очень надуманным.

РЕДАКТИРОВАТЬ - из любопытства я набрал программу, скомпилировал ее и запустил с помощью Java 1.6.0_16. Ошибка компилятора для меня не очевидна:

  • При включенных утверждениях (тест java -ea) я получаю ошибку подтверждения.
  • С отключенными утверждениями (тест Java) я получаю вывод no .
0 голосов
/ 17 февраля 2010

JVM оптимизирует предложение if (o! = Null), поскольку вы уже заявили, что o никогда не будет нулевым.

Утверждение не включено по умолчанию во время выполнения и обычно используется для проверки того, что код выполняет некоторый контракт, например, Вы просто хотите убедиться, что определенный объект никогда не будет нулевым (например, чтобы избежать исключений нулевого указателя). Именно из-за этого «контракта» компилятор может оптимизировать if (o! = Null), поскольку он знает, что это условие никогда не произойдет.

Поскольку они, как правило, не включаются во время выполнения, считайте их помогающими разрабатывать фрагмент кода, а не механизм проверки ошибок во время выполнения.

...