Инициализация переменной экземпляра методом из класса - PullRequest
0 голосов
/ 10 февраля 2009

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

Примерно так:

public class MyClass {

     integers[] myArray = new integers[length()];

     int length() {
     ....

     }
}

length() дает мне некоторое число, и я хочу, чтобы это число определяло количество элементов в массиве. Мне это кажется правдоподобным, но я получаю NullPointerException (я не знаю, является ли эта ошибка инициализации причиной исключения, но я не знаю, что именно, и потому что я никогда раньше не делал эту инициализацию, я не уверен это правильно).

Ответы [ 4 ]

3 голосов
/ 10 февраля 2009

Кажется, работает нормально для меня, с методом static или не статичным:

public class test
{
    public int[] myarray = new int[this.length()];

    public int length() {
        return 5;
    }

    public static void main(String[] args)
    {
        test foo = new test();
        for (int element : foo.myarray) {
            System.out.println(element);
        }
    }
}

Который производит:

0
0
0
0
0
2 голосов
/ 10 февраля 2009

Скорее всего, проблема в методе length(). Я подозреваю, что это относится к переменной, которая еще не была должным образом инициализирована. Вот пример программы, которая показывает, что:

public class MyClass {

    int[] myArray = new int[length()];

    // This is only initialized *after* myArray
    String myString = "Hi";

    int length() {
        return myString.length();
    }

    public static void main(String[] args) {
        new MyClass(); // Bang!
    }
}

Если это является проблемой, я предлагаю вам вместо этого выполнить инициализацию в конструкторе - таким образом, порядок намного более понятен.

2 голосов
/ 10 февраля 2009

Прежде чем сделать это, возможно, стоит подумать, не слишком ли сбивает с толку этот синтаксис, и что может быть целесообразнее инициализировать массив в конструкторе или в блоке инициализации.

private final int[] myArray;

public MyClass() {
    myArray = new int[length()];
}

или

private final int[] myArray;
{
    myArray = new int[length()];
}
0 голосов
/ 10 февраля 2009

Вы должны сделать метод статическим:

static int length() { … }
...