0

我有一个名为 input1.txt 的文件,其内容如下:

A B C D

BD

光盘

我想阅读它并将它们放入二维字符串数组中。我已经为它编写了代码。但它显示 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();
    }
4

5 回答 5

3

缺少列graphNodes长度

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

在你的问题中,一旦你得到letters,你可以初始化二维数组的列

String[] letters = line[x].split(" ");
graphNodes[i] = new String[letters.length];
于 2013-08-18T07:59:14.777 回答
1

您需要graphNodes[i]在访问其j索引之前进行实例化。

于 2013-08-18T07:56:00.460 回答
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 语句说“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]但你会想要调整它以满足你的需要(不管你预计最长的字母行有多长。

于 2013-08-18T08:09:17.203 回答
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++;
        }
    }
于 2013-08-18T08:17:46.030 回答
0

首先,您不需要两次读取文件。一次获取行数,另一次获取实际数据。您需要阅读这些行并将它们直接放入列表中。然后,您可以使用该列表做任何您需要的事情。

于 2013-08-18T08:01:26.473 回答