Конструктор или функция для изменения полей класса - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть два поля: long nr и вектор long, как показано ниже:

public class Pair {

    public long nr;
    public Vector<Long> lines;

    public Pair(long ap, long line){
        this.nr=ap;
        if (line!=0) lines.add(linie);
         else lines=null; 
    }

    public void create (long line){
        nr++;
        lines.add(line);
    }
}

Я хочу иметь функцию (create), чтобы она модифицировала поля класса.В основном классе у меня есть

Pair per1=new Pair(0,0);
Pair per2=new Pair(0,0);

per1.create(3);
per2.create(4);

Конструктор работает нормально, но создание не делает.Что такое объяснение и как должна выглядеть функция? Большое спасибо.

Ответы [ 6 ]

2 голосов
/ 06 декабря 2011

Две проблемы:

  • Ваш конструктор никогда не будет работать для ненулевых значений;он выдаст исключение нулевого указателя.Это потому, что вы никогда не инициализируете lines.Вам нужно будет инициализировать его, когда вы определите его как член или в конструкторе (как lines = new Vector<Long>();)

  • Вы всегда получите исключение нулевого указателя, поскольку вы устанавливаете переменную lines до null, когда вы вызываете конструктор с аргументом line как 0.Когда вы впоследствии вызовете create, вы получите исключение нулевого указателя при запуске lines.add(line).

Чтобы исправить ваши проблемы, я бы сделал что-то вроде этого:

lines = new Vector<Long>();

if(line != 0) {
   lines.add(line);
}

Обратите внимание, что нет else.Я не уверен, почему вам нужно установить lines на null, но понимаю, что если вы это сделаете, вы не сможете использовать его позже.Это также довольно странный побочный эффект, который может вызвать замешательство у пользователей вашего класса.

Несколько других указателей.

  • Пожалуйста, используйте правильный синтаксис Java и соглашения об именах.Всегда окружайте свои if и else фигурными скобками:

    if (line! = 0) {lines.add (line);} else {...}

    • Используйте описательные имена переменных.nr и ap не очень ясны.
    • Действительно ли nr и lines должны быть public?Это скорее исключение, чем правило.
1 голос
/ 06 декабря 2011

Ваш lines вектор никогда не инициализируется. Вызов вашего конструктора со значением, отличным от 0, также вызовет исключение NullPointerException.

Вы можете изменить объявление поля на Vector<Long> lines = new Vector<Long>(); или вызвать lines = new Vector<Long>(); в начале вашего конструктора и просто ничего не делать, если значение второго аргумента равно 0.

1 голос
/ 06 декабря 2011

Вы никогда не создавали экземпляр Vector, вызывая new Vector<Long>() в своем коде.Более того, вы устанавливаете переменную класса lines в null, если line == 0.

Ваш код должен выглядеть так:

public class Pair {

public long nr;
public Vector<Long> lines = new Vector<long>();

public  Pair(long ap, long line){
    this.nr=ap;
    if (line!=0) lines.add(linie);
}

public void create (long line){
    nr++;
    if (line!=0) lines.add(linie);
}

}
1 голос
/ 06 декабря 2011

Строка в конструкторе устанавливает для вашего Vector значение null, поэтому вы не сможете добавить его позже.

if (line!=0) lines.add(linie);
        else lines=null; // <-- cant call add later on lines

Между прочим, это даже не сработает, если вы вызовете конструктор с любым другим параметром, поскольку вы вообще никогда не инициализируете свои строки Vector.

Я не знаю, что именно вы пытаетесь сделать, но вы можете изменить определение поля на

public Vector<Long> lines = new Vector<Long>();

А затем удалите остальное в вашем конструкторе.

0 голосов
/ 06 декабря 2011

Конструктор для строк отсутствует.

Либо в определении строк, либо в конструкторе Pair необходимо инициализировать строки:

lines = new Vector<Long>();
0 голосов
/ 06 декабря 2011

Во-первых, я не уверен, что имя класса соответствует поведению. Такие имена, как nr, затрудняют работу с кодом. Попробуйте переименовать это в нечто более значимое.

Ключ в том, что вы никогда не создаете объект Vector, только ссылки.

поэтому я бы заставил ваш конструктор сделать это:

public  Pair(long ap, long line){
    this.nr=ap;
    lines = new Vector<Long>();
    if (line!=0) lines.add(line);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...