Findbugs дает разыменование нулевого указателя System.out, почему?

Я использую Java 1.7, Eclipse 3.7 с плагином FindBugs из магазина. Пример прекрасен как небо:

class Application
{
  public static void main( String[] args )
  {
    System.out.println( "Bla" );
  }
}

Раньше этого сообщения не было, а внутренняя реализация всегда была в Системе:

public final static PrintStream out = null;

Итак, Findbugs прав, но изменилось ли что-то, что сообщение появляется сейчас?


person Johnannes Münch    schedule 06.07.2011    source источник
comment
Не обязательно, скорее всего, где-то есть блок, который присваивает out чему-то (блок static). Судя по документации, FindBugs все еще является экспериментальной и может не всегда работать должным образом. Это звучит как ошибка в findbugs... Я предполагаю, что код работает, если вы запускаете его через стандартную JVM?   -  person Chris Thompson    schedule 06.07.2011
comment
Конечно, это работает. Я думаю, что это как-то связано с переключением на Java 7, потому что инициализация больше НЕ находится в static {} (что, я думаю, было, у меня сейчас нет версии Java 6).   -  person Johnannes Münch    schedule 06.07.2011


Ответы (3)


Потому что в java 6 это выглядело так:

public final static PrintStream out = nullPrintStream();

/**
 * The following two methods exist because in, out, and err must be
 * initialized to null.  The compiler, however, cannot be permitted to
 * inline access to them, since they are later set to more sensible values
 * by initializeSystemClass().
 */
private static PrintStream nullPrintStream() throws NullPointerException {
    if (currentTimeMillis() > 0) {
        return null;
    }
    throw new NullPointerException();
}

поэтому я предполагаю, что они упростили это в java 7 и добавили некоторые исключения в компилятор.

JVM управляет выходом, входом и ошибкой в ​​​​родном коде, поэтому это сообщение об ошибке, которое она выдает, бессмысленно.

person Denis Tulskiy    schedule 06.07.2011

Это помечено как ошибка в Findbugs 1.3.9. . Это было исправлено для Findbugs 2.0 и может быть перенесено обратно.

person Thirler    schedule 29.11.2011
comment
К сожалению, это все еще происходит. По крайней мере, я все еще получаю эту ошибку с помощью плагина Findbugs Maven. Который должен использовать Findbugs 2 начиная с версии 2.3.3. - person Jan Goyvaerts; 24.01.2012
comment
В этом случае, возможно, стоит снова сообщить об ошибке, в комментариях четко указано, что она должна быть исправлена ​​в findbugs 2. - person Thirler; 24.01.2012

Это происходит только с openjdk, а не с sun jdk.

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

http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-July/009869.html

person Ivan Kelly    schedule 23.10.2012