Я пытаюсь инициализировать массив (созданного мной объекта класса) из двух измерений, но у меня сохраняется та же ошибка времени выполнения:
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 ...");
The error is marked at the line were I try to give a value to the matrix: matrix[i][0] = ....
Насколько я понял после своих исследований, Java присвоила значение null каждому члену массива, что меня устраивает. Но почему он помечает меня как ошибку, когда я пытаюсь заменить нулевое значение существующим. Я не вызываю метод с нулевым значением.
Полный код:
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.
}
}
Класс Matrix (который находится внутри основного класса):
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)
Я отправлю полную трассировку класса + стека один раз обратно на свой компьютер.




Я попробовал то же самое, и он работает. Вот мой код:
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.
Я использую Java 8 и gradle. Я попробую ввести код еще раз, чтобы проверить, работает ли он. Если нет, я отправлю полный курс в новом сообщении. Спасибо за помощь!
Ваш код кажется правильным. Просто логическая ошибка при инициализации матрицы. А как насчет вашего конструктора? Внутри есть какой-то код, который может вызывать NPE?
Если NPE возникает внутри конструктора, компилятор может указать ошибку на линейной матрице [i] [0] ... когда это происходит внутри конструктора. Вы можете смотреть только на верхнюю часть трассировки стека, когда реальная проблема находится ниже. Сказать можно только по полной трассировке стека.
Я бы сказал, что нет никакого способа получить NPE, кроме вызова метода с нулевым значением. Я отредактировал сообщение, чтобы было больше информации.
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.
Спасибо за помощь, я совершенно забыл, что вызывал пустой элемент объекта в параметрах конструктора ... И спасибо за то, что научил меня, что трассировка стека всегда будет указывать на 1-ю строку метода, длина которого составляет несколько строк!
Не могли бы вы опубликовать более длинную трассировку стека и аргументы, которые вы даете новому MyCustomObject.