2012-03-07 5 views
2

Вот я, думая, что знаю Java, и получаю ошибку Variable 'storage' might not have been initialized. Вот мой код:Возможно, переменная не была инициализирована

public class RobbleSet { 
    private final Set<Robble> storage; // Error occurs here 

    public RobbleSet() { 
     storage = new HashSet<Robble>(); 
    } 

    public addRobble(Robble r) { 
     storage.add(r); // Error occurs here too 
    } 
} 

storage инициализируется в конструкторе. Что дает?

+2

Возможно, вы захотите проверить, что это конструктор * only *. Если у вас несколько конструкторов, каждый из них должен будет инициализировать 'storage'. Еще лучше, просто напишите 'private final Set storage = new HashSet ();' для начала, и вам не нужно будет помещать его в конструктор. :-) – ruakh

+0

У меня определенно есть только один конструктор. Существуют ли какие-либо технические различия (на уровне байт-кода/выполнения) инициализации в поле, а не в конструкторе? –

+0

Я только что написал ответ - и вижу, что вы отредактировали свой вопрос, чтобы сказать то же самое. Что касается технических различий между инициализацией в одном месте по сравнению с другим: не совсем. Из того, что я понимаю, разница будет передаваться из исходного кода в байт-код (поскольку одна версия идет в методе 'init', а не в конструкторе), но это не должно иметь никакого * реального * эффекта. – ruakh

ответ

5

Одна проблема заключается в том, что вы не объявляете тип возврата для addRobble; вам нужно изменить:

public addRobble(Robble r) { 

к этому:

public void addRobble(Robble r) { 

Я подозреваю, что это проблемы —, что ваш компилятор считает, что addRobble это неправильно именованный конструктор, так жалуется, что она не для инициализации storage —, но даже если выясняется, что это не проблема, это определенно a проблема.

+0

+1 Я тоже это заметил, но я бы подумал, что в этом случае он увидит другую ошибку. – Aaron

2

addRobble не имеет типа возврата, поэтому статический анализатор подбирает его как конструктор, хотя он не называется RobbleSet. Правильный код выглядит следующим образом:

public class RobbleSet { 
    private final Set<Robble> storage; // Error occurs here 

    public RobbleSet() { 
     storage = new HashSet<Robble>(); 
    } 

    public void addRobble(Robble r) { 
     storage.add(r); // Error occurs here too 
    } 
} 
Смежные вопросы