Findbugs дает "разыменование нулевого указателя System.out", почему? - PullRequest
18 голосов
/ 06 июля 2011

Я использую Java 1.7, Eclipse 3.7 с плагином FindBugs с торговой площадки.Пример так же хорош, как небеса:

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

Это сообщение не существовало в прошлом, и внутренняя реализация всегда была в System:

public final static PrintStream out = null;

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

Ответы [ 3 ]

15 голосов
/ 06 июля 2011

Потому что в 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 управляет внутренним кодом, вводит его и ошибается, поэтому это сообщение об ошибке не имеет смысла.

11 голосов
/ 29 ноября 2011

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

3 голосов
/ 24 октября 2012

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

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

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

...