初始化尺寸为2

时间:2018-11-08 11:56:30

标签: java arrays multidimensional-array nullpointerexception

我正在尝试初始化二维的(创建的类对象的)数组,但我仍然遇到相同的运行时错误:

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)

3 个答案:

答案 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].costrow==1时。您从未创建过distanceMatrix [0] [0],它为null,然后尝试访问其cost字段。 我假设option对象不是null(同样值得检查)。

如果单个方法调用的行长为几行,则堆栈跟踪将指向调用开始的行。例如。 new Matrix()调用开始于第54行,结束于58,在第55行发生错误,但堆栈跟踪指向54。