我正在尝试初始化二维的(创建的类对象的)数组,但我仍然遇到相同的运行时错误:
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值,这对我来说还可以。但是,当我尝试用现有值替换null值时,为什么会把我标记为错误。我不是在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)
答案 0 :(得分:2)
我尝试了同样的事情,并且有效。这是我的代码:
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版本,如果您使用的是Maven,则可以pom.xml
告诉我们吗?另外,为确保确定,您还可以发布MyCustomObject
的代码段。
答案 1 :(得分:0)
您的代码接缝是正确的。矩阵初始化时只有逻辑错误。那你的构造函数呢?里面有一些代码可能会导致NPE?
如果NPE发生在构造函数内部,则编译器可能在构造函数内部发生错误时将其指向行矩阵[i] [0]...。当真正的问题出现在下面时,您可能只看堆栈跟踪的上部。只是完整的堆栈跟踪可以说。
答案 2 :(得分:0)
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],它为null,然后尝试访问其cost字段。
我假设option
对象不是null(同样值得检查)。
如果单个方法调用的行长为几行,则堆栈跟踪将指向调用开始的行。例如。 new Matrix()
调用开始于第54行,结束于58,在第55行发生错误,但堆栈跟踪指向54。