2

У меня есть этот маленький кусочек кода здесь, который всегда будет бросить NPE:Может ли объект, ссылающийся на внутреннюю инициализацию с двойной привязкой, не дать NPE?

public class Test1 { 
    private final static Object OBJECT = new Object() {{ 
     System.out.println("OBJECT.toString() = " + OBJECT.toString()); 
    }}; 
    public static void main(String[] args) { } 
} 

Есть ли способы, однако, что OBJECTможет быть инициализирован в блоке инициализации экземпляра? Или все возможные ссылки на OBJECT в блок инициализации экземпляра всегда бросают NPE?

Для тех, кто находится в самом быстром оружии, читайте это: Нет, я не прошу вас решить мою ошибку. Это упрощенный фрагмент кода, который я где-то видел, и, к моему удивлению, не дает ничтожного предупреждения в Eclipse или Netbeans, что я ожидаю от него.

+3

Почему вы не можете просто использовать 'this'? –

+0

Это ошибка, которую я обнаружил при решении существующей проблемы где-то, и ни Eclipse, ни Netbeans не дают предупреждение о нулевом указателе, которое я ожидал бы там. – skiwi

+0

Как насчет FindBugs? Я думаю, что он доступен как плагин для Eclipse и Netbeans. – tucuxi

ответ

1

Double brace initialisation - всего лишь анонимный внутренний класс с инициатором экземпляра. Поэтому применяются правила, регулирующие создание объектов.

NPE - это исключение Runtime Exception, поэтому среда IDE использует эвристику, чтобы найти виновников, а не строгость и определенность, предоставляемые статическим набором текста, объявленными исключениями и анализом статического кода. Здесь он должен будет выполнить код, чтобы найти проблемы во время выполнения.

Что происходит в этом случае: a static Участник инициализируется присвоением ему анонимного внутреннего класса. Конструктор внутреннего класса завершен, так как это правило, например, инициализаторы. Однако эта ссылка присваивается только после завершения инициализации, которой они не были к тому времени, когда вы пытаетесь разыменовать OBJECT.

Кажется, очень круговым объяснение, но это потому, что происходит круговое реферирование;)