Инициализация массива пользовательских объектов измерения 2 - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь инициализировать массив (из созданного мною объекта класса) из 2 измерений, но у меня по-прежнему возникает одна и та же ошибка времени выполнения:

Exception in thread "main" java.lang.NullPoointerException
    at ........

Мне удалось сделать это с примитивными типами, но не с типами, расширяющими объект, и я хотел бы знать, возможно ли это (и если да, то как).

Вот пример моего кода:

MyCustomObject[][] matrix = new MyCustomObject[10][10];

for (int i = 0; i < 10; i += 1)
    matrix[i][0] = new MyCustomObject("some arguments ...");

Ошибка отмечена в строке, где я пытаюсь присвоить матрице значение: matrix [i] [0] = ....

Из того, что я понимаю после моих исследований, Java дала значение null каждому члену массива, что мне подходит. Но почему это пометит меня как ошибку, когда я пытаюсь заменить нулевое значение существующим. Я не вызываю метод с нулевым значением.

EDIT

Полный код:

int sourceLength = source.length(); // Length of a CharSequence
int targetLength = target.length(); // Length of a CharSequence
Matrix distanceMatrix[][] = new Matrix[sourceLength][targetLength];

for (int row = 1; row < sourceLength; row += 1) {
    distanceMatrix[row][0] = new Matrix(        // The error is marked at this line.
        distanceMatrix[row - 1][0].cost + option.getDeletionCost(),
        row - 1,
        0
    );
}

for (int column = 1; column < targetLength; column += 1) {
    distanceMatrix[0][column] = new Matrix(
        distanceMatrix[0][column - 1].cost + option.getInsertionCost(),
        0,
        column - 1
    );
}

for (int row = 1; row < sourceLength; row += 1) {
    for (int column = 1; column < targetLength; column += 1) {

        // do more stuff.

    }
}

Матричный класс (который находится внутри основного класса):

public final static class Matrix {

    public int cost;
    public int row;
    public int column;

    public Matrix(int cost, int row, int column) {
        this.cost = cost;
        this.row = row;
        this.column = column;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Matrix)
            return (cost == ((Matrix)obj).cost
                && row == ((Matrix)obj).row
                && column == ((Matrix)obj).column);
        return (super.equals(obj));
    }

}

Следы стека:

Exception in thread "main" java.lang.NullPointerException
    at net.azzerial.gt.core.Fuzzy.distance(Fuzzy.java:54)
    at net.azzerial.gt.core.Fuzzy.levenshteinDistance(Fuzzy.java:24)
    at net.azzerial.gt.Test.main(Test.java:15)

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Ваш код кажется правильным. Там просто логическая ошибка при инициализации матрицы. А как насчет вашего конструктора? Внутри есть какой-то код, который может вызывать NPE?

Если NPE встречается внутри конструктора, компилятор может указать ошибку на матрицу строк [i] [0] ... когда это происходит внутри конструктора. Вы можете смотреть только верхнюю часть трассировки стека, когда реальная проблема ниже. Можно сказать только трассировка полного стека.

0 голосов
/ 08 ноября 2018
Matrix distanceMatrix[][] = new Matrix[sourceLength][targetLength];

for (int row = 1; row < sourceLength; row += 1) {
    distanceMatrix[row][0] = new Matrix(        // The error is marked at this line.
        distanceMatrix[row - 1][0].cost + option.getDeletionCost(), //actually it occurs here
        row - 1,
        0
    );
}

Проблема в том, что вы пытаетесь позвонить distanceMatrix[row - 1][0].cost и row==1. Вы никогда не создавали distanceMatrix [0] [0], он нулевой, и вы пытаетесь получить доступ к его полю стоимости. Я предполагаю, что объект option не равен нулю (также стоит проверить).

Если один вызов метода имеет длину в несколько строк, трассировка стека укажет строку, где начинается вызов. Например. new Matrix() вызов начинается в строке 54 и заканчивается в 58, ошибка возникает в строке 55, но трассировка стека указывает на 54.

0 голосов
/ 08 ноября 2018

Я попробовал то же самое, и это работает. Вот мой код:

 public class StackOverFlow {

    public static void main(String[] args) {
        Foo[][] foos = new Foo[10][10];
        for(int i=0;i<10;i++){
            foos[i][0]= new Foo();
        }
    }

    public static class Foo{
    }
}

Можете ли вы сказать нам, какую версию java вы используете, и вашу pom.xml, если вы используете maven? Кроме того, просто чтобы быть уверенным, вы также можете опубликовать фрагмент кода MyCustomObject.

...