instanceof Double / Object не будет работать :(

У меня проблема с экземпляром java. Вот пробел в коде, который вызывает у меня проблемы:

LinkedList<Double> currentSummary = summary.getFirst().getQuantiles();

... еще код ...

while (!currentSummary.isEmpty()){

        if (currentSummary.getFirst() instanceof Double){
            orderedSummary.add(new ComparableWrapper<Double, Float>(currentSummary.removeFirst(), currentEpsilon));
        }
}

Итак, моя проблема в том, что условие if не выполняется. Эти элементы в currentSummary имеют значение null или Double. И я пытаюсь отклонить элементы, которые null. Сначала я просто добавил их, а позже наткнулся на NullPointerException, потому что некоторые (но не все!) Элементы были null. Примером элемента currentSummary является, например, [нуль, 0,09861866469135272, 10,137051035535745, 107,12083740100329, 371,4371264801424, 827,432799544501, 1206,251577083686].

Кто-нибудь знает, почему instanceof не сработает в таком случае? Я тоже пробовал с currentSummary.getFirst() instanceof Object ...

Заранее спасибо!


person mkko    schedule 03.07.2010    source источник
comment
Не прямо ответ, но поскольку вы, похоже, не удаляете записи null из связанного списка, не будет ли эта вещь бесконечным циклом при первом null, с которым она сталкивается? Не могли бы вы убедиться, что getQuantiles() не помещает null ссылки в ваш список?   -  person sarnold    schedule 03.07.2010
comment
currentSummary.getFirst() instanceof Object ведет себя иначе?   -  person Christian Semrau    schedule 03.07.2010
comment
Вы также можете попробовать currentSummary.getFirst().getClass() узнать, к какому классу на самом деле принадлежат объекты.   -  person ejel    schedule 03.07.2010
comment
Нет, это не так. Но проблема была совсем не в этом. Я просто забыл удалить первый элемент, если он нулевой. Итак, я столкнулся с бесконечным циклом ...   -  person mkko    schedule 03.07.2010


Ответы (4)


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

person Eyal Schneider    schedule 03.07.2010
comment
Ладно, у меня определенно тепло. Проблема, конечно же, заключалась в бесконечном цикле. - Большое спасибо :) - person mkko; 03.07.2010

Возможно ли, что из-за автоматической упаковки / распаковки объекты Double распаковываются в примитив double, и поэтому они не являются экземпляром класса Double.

Если это так, было бы лучше, если бы вы вместо этого проверили ненулевые элементы?

person ejel    schedule 03.07.2010
comment
Ни autoboxing, ни autounboxing не происходит для теста instanceof. - person Christian Semrau; 03.07.2010

Почему бы вам просто не использовать простую нулевую проверку?

if (currentSummary.getFirst() != null){ ... }
person Tim Bender    schedule 03.07.2010
comment
Я согласен, но это не объясняет, почему instanceof возвращает false для ненулевых значений. - person Eyal Schneider; 03.07.2010
comment
Поначалу кажется, что это не работает. Но вы правы, это тоже сработает и выглядит намного лучше;) Спасибо - person mkko; 03.07.2010

Можно, используя необработанные типы (LinkedList вместо LinkedList<Double>), добавить в ваш LinkedList<Double> записи, отличные от Double. Эти элементы не пройдут instanceof Double тест. Но эти записи пройдут instanceof Object тест.

person Christian Semrau    schedule 03.07.2010