Findbugs дает "Nereference poere разыменовывает System.out", почему?
Я использую 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 правильно, но что-то изменило, что сообщение появилось сейчас?
Ответы
Ответ 1
Потому что в 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 управляет, in и err в собственном коде, поэтому это сообщение об ошибке, которое оно дает, бессмысленно.
Ответ 2
Это отмечено как ошибка в Findbugs 1.3.9. Он был исправлен для Findbugs 2.0 и может быть отправлен обратно.
Ответ 3
Это происходит только с openjdk, а не с sun jdk.
Проблема заключается в исправлении, опубликованном в 2010 году, чтобы разрешить системные времена старше 1970 года.
http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-July/009869.html