Android:nullpointerexception尝试从null数组中读取

时间:2017-01-02 00:35:37

标签: java android

我怀疑makeLine方法以某种方式创建了一个null数组,但我不太确定。

任何帮助将不胜感激!我的代码片段如下:

public void all() {

        int[][] line = new int[3][];

        for (int i = 0; i < 3; i++) {
            if (i > 0 && line[i - 1][0] == 2) { // Error occurs at this line
                int start = line[i - 1][2];
                int pos = line[i - 1][1];
                int xy = line[i - 1][3]++;

                if (line[i - 1][3] == 1) {
                    int end = y()[1];
                    line[i] = new int[]{1, start, end, pos, xy};
                } else {
                    int end = x()[1];
                    line[i] = new int[]{1, start, end, pos, xy};
                }
            } else {
                line[i] = makeLine();
            }
        }
}

private int[] makeLine() {
                Random r = new Random();

                int startX = x()[0];
                int endX = x()[1];
                int startY = y()[0];
                int endY = y()[1];

                int xy = r.nextInt(3 - 1) + 1;

                if (xy == 1) {
                    return new int[]{1, startX, endX, startY, xy};
                }

                return new int[]{1, startY, endY, startX, xy};
            }

private int[] x() {
        DisplayMetrics displaymetrics = context.getResources().getDisplayMetrics();
        int xLeft = (int) (13 * displaymetrics.density);
        int xRight = (int) (displaymetrics.widthPixels - (13 * displaymetrics.density));

        Random r = new Random();
        int startX = r.nextInt(xRight - xLeft) + xLeft;
        int endX = r.nextInt(xRight - xLeft) + xLeft;

        return new int[]{startX, endX};
    }

private int[] y() {
        DisplayMetrics displaymetrics = context.getResources().getDisplayMetrics();
        int yTop = (int) (60 * displaymetrics.density);
        int yBottom = (int) (displaymetrics.heightPixels - (51 * displaymetrics.density));

        Random r = new Random();
        int startY = r.nextInt(yBottom - yTop) + yTop;
        int endY = r.nextInt(yBottom - yTop) + yTop;

        return new int[]{startY, endY};
    }

2 个答案:

答案 0 :(得分:1)

异常是因为你在初始化之前尝试访问了行[0] [0],那里什么都没有。

通过做:

int[][] line = new int[3][];

您只为此多维数组创建一个维度。这样做的方法是:

int[][] line = new int[3][SOME_NUMBER];

或显式初始化每一行:

int[][] line = new int[3][];
for (int i = 0; i < 3; i++) {
  line[i] = new int[SOME_NUMBER];
}

如果您需要更好地理解它,请查看此处,例如:[Java中的多维数组

] 1

答案 1 :(得分:0)

我认为你得到一个空指针,因为你引用了一个超出数组边界的元素。您收到错误的行应如下所示:

if (i > 0 && line[i][0] == 2) {

而不是:

if (i > 0 && line[i - 1][0] == 2)

这个程序都有类似的错误。请记住,数组开始索引为0而不是1。

相关问题