插入字符串的二维数组时获取空指针异常

时间:2013-08-18 07:54:45

标签: java arrays string nullpointerexception

我的文件名为input1.txt,内容如下:

a b c d

b d

c d

d e

我想阅读它并将它们放在字符串的二维数组中。我已经为它编写了代码。但它显示NULL POINTER EXCEPTION。哪里可能是错误?以下是我的代码:

我在第graphNodes[i][j] = s;

中获得了异常
BufferedReader br = null;
    BufferedReader cr = null;
    int lines = 0;
    try {
        br = new BufferedReader(new FileReader(filename));
        try {
            while (br.readLine() != null) {
                lines++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
    List<String> nodes = new ArrayList<String>();
    String[][] graphNodes = new String[lines][];
    String[] line = new String[lines];
    int i = 0;
    int j = 0, x = 0;
    try {
        cr = new BufferedReader(new FileReader(filename));
        while (cr.readLine() != null) {
            line[x] = cr.readLine();
            System.out.println("Line is: " + line[x]);
            String[] letters = line[x].split(" ");
            for (String s : letters) {
                 System.out.println("Letter is " + s);
                graphNodes[i][j] = s;
                j++;
            }
            i++;
            x++;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

5 个答案:

答案 0 :(得分:3)

graphNodes缺少列长

String[][] graphNodes = new String[lines][];

在您的问题中,一旦获得letters,您就可以初始化2d数组的列

String[] letters = line[x].split(" ");
graphNodes[i] = new String[letters.length];

答案 1 :(得分:1)

在访问graphNodes[i]索引之前,您需要实例化j

答案 2 :(得分:1)

我相信您在使用以下代码时遇到问题:

try {
    cr = new BufferedReader(new FileReader(filename));
    while (cr.readLine() != null) {
        line[x] = cr.readLine();
        System.out.println("Line is: " + line[x]);
        String[] letters = line[x].split(" ");
        for (String s : letters) {
             System.out.println("Letter is " + s);
            graphNodes[i][j] = s;
            j++;
        }
        i++;
        x++;
    }
}

这个while语句说“当cr.readLine()!= null”时,在那一刻它读取文件的第一行,将其与null进行比较,它不是null,因此它进入循环。然后你告诉它将line [x]设置为等于cr.readLine()然后读取文件的下一行,并将其设置为等于line [x]。因此,跳过第一行代码而不是使用它来检查while循环条件。

我认为你在while循环中想要的东西是这样的

try {
        cr = new BufferedReader(new FileReader(filename));
        for(String lineValue = cr.readLine(); lineValue != null; x++, lineValue = cr.readLine()) {
            line[x] = lineValue;
            System.out.println("Line is: " + line[x]);
            String[] letters = line[x].split(" ");
            for (String s : letters) {
                 System.out.println("Letter is " + s);
                graphNodes[i][j] = s;
                j++;
            }
            i++;
        }
    } 

但正如前面提到的那样,你需要声明二维数组的大小。为了这个循环我只是做了String[lines][100],但你需要调整它以满足你的需求(不管你预期你的最长字母是多久。

答案 3 :(得分:1)

对于其中一个,您没有为第二个维度指定值:String[][] graphnodes = new String[lines][]。 这意味着您基本上是在尝试将s设置为不存在的值。 您可以先尝试定义String[] letters,然后再执行String[][] graphnodes = new String[lines][letters.getLength()];

之类的操作

while (cr.readLine() != null)应为while (cr.hasNextLine())

如果您执行以下操作,您的代码也会更加清晰:

    for (int i = 0, j = 0, x = 0; cr.hasNextLine(); i++, x++) {
        line[x] = cr.readLine();
        System.out.println("Line is: " + line[x]);
        String[] letters = line[x].split(" ");
        for (String s : letters) {
             System.out.println("Letter is " + s);
            graphNodes[i][j] = s;
            j++;
        }
    }

答案 4 :(得分:0)

首先,您不需要两次读取文件。一旦得到行数,另一行得到实际数据。 您需要读取行并将它们直接放在List中。然后,您可以使用该列表执行任何操作。