Необычное поведение Java - почему это работает?

Я обнаружил интересное поведение ... Я не могу решить, ошибка это или некомпетентность, но в настоящее время склоняюсь к некомпетентности.

Этот код не войдет в цикл, даже если есть ожидающие сообщения:

Message msg;
while ((msg = consumer.receiveNoWait()) != null) {
    System.out.println(msg);
}

Этот код ДЕЙСТВИТЕЛЬНО входит в цикл, обратите внимание на нулевое назначение:

Message msg = null;
while ((msg = consumer.receiveNoWait()) != null) {
    System.out.println(msg);
}

Этот код работает на Glassfish 3.1.1b10 HotSpot 1.6_26 на 32-битной Windows . Я не могу придумать объяснения, почему первый блок не работает!

РЕДАКТИРОВАТЬ / ОБНОВЛЕНИЕ 13 июля 2011 г .:

Во-первых, я начал останавливать домен Glassfish и удалять его между развертываниями по запросу, и это все еще происходит :)

Во-вторых, я не могу выполнить синхронизацию на Destination или Consumer, так как это код Java EE. Но я могу заверить, что сообщения доступны. Их в наличии около 500 и нет потребителей. Фактически создание QueueBrowser говорит мне, что сообщения доступны!

В-третьих, эта программа печатает «РАБОТАЕТ!» каждый раз!!! АРГХ !!!

public static void main(String[] args) {
    Object obj;

    if ((obj = getNotNull()) != null) {
        System.out.println("worked!");
    } else {
        System.out.println("failed!");
    }
}

static Object getNotNull() {
    return new Object();
}

Напоследок я говорил о собственной некомпетентности. ;)

9
задан Arjan Tijms 30 June 2013 в 07:21
поделиться