来自File的Array Build中的NullPointerException

时间:2013-08-07 01:04:53

标签: java null nullpointerexception multidimensional-array

*以下代码从文本文件中的字符串构建“2D”array。目前它在行上返回NullPointException错误:

  

temp = thisLine.split(delimiter);   我的问题是,我是否理解temp正在返回null?如果是,为什么,以及如何为null添加支票?我是Java的新手,这是我第一次尝试从文件创建array字符串arrays。*

-------- --------编辑

上述问题已经解决。

对于下面感兴趣的人,返回IndexOutOfBoundsException.的代码特别是行:

  

fileContents.set(i,fileContents.get(i).replace(hexLibrary [i] [0],hexLibrary [i] [1]));

System.out.println("SnR after this");

    String[][] hexLibrary;    // calls the replaces array from the LibToArray method
    hexLibrary = LibToArray();

    for(int i=0;i<502;i++){
        {
        fileContents.set(i, fileContents.get(i).replace(hexLibrary[i][0], hexLibrary[i][1]));
        }       
        }
    for (String row : fileContents) {
        System.out.println(row);        // print array to cmd
        }

_ __ _ __ _ __ _ __ _ 的__ _ __ _ __ _ __ _ __ _ __


    public static String[][] LibToArray()
    {

        String thisLine;  
         String[] temp;  
         String delimiter=",";  
         String [][] hexLibrary = new String[502][2];  
    try
        {
            BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt"));  
            for (int j=0; j<502; j++) {  
                    thisLine=br.readLine(); 
                    temp = thisLine.split(delimiter);  
             for (int i = 0; i < 2; i++) {  
                hexLibrary[j][i]=temp[i];  
             }  
            }   
        }
        catch (IOException ex) {    // E.H. for try
        JOptionPane.showMessageDialog(null, "File not found.  Check name and directory."); // error message
        }
    return hexLibrary;
    }

3 个答案:

答案 0 :(得分:1)

thisLine更有可能是null。如果在读取502行之前用完输入,就会发生这种情况。如果thisLine不是null,则thisLine.split(delimiter)将不会返回null。您应该始终检查null行:

for (int j=0; j<502; j++) {  
    thisLine=br.readLine(); 
    if (thisLine != null) {
        temp = thisLine.split(delimiter);  
        for (int i = 0; i < 2; i++) {  
            hexLibrary[j][i]=temp[i];  
        }  
    } else {
        // report error: premature end of input file
        break; // no point in continuing to loop
    }
}

就个人而言,我会写你的方法不假设任何特定的文件长度:

public static String[][] LibToArray() {
    List<String[]> lines = new ArrayList<>();
    String delimiter=",";  
    try (BufferedReader br= new BufferedReader(new FileReader("hexlibrary.txt"))) {
        String line = br.readLine();
        while (line != null) {
            String[] tmp = line.split(delimiter);
            // the next line is dangerous--what if there was only one token?
            // should add a check that there were at least 2 elements.
            lines.add(new String[] {tmp[0], tmp[1]});
            line = br.readLine();
        }
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "File not found.  Check name and directory.");
    }
    String[][] hexLibrary = new String[lines.length][];
    lines.toArray(hexLibrary);
    return hexLibrary;
}

(以上使用新的Java 7 try-with-resources syntax。如果您使用的是早期的Java,则应该在方法返回之前添加一个finally子句,关闭br

答案 1 :(得分:0)

在阅读文件时,您没有检查流的结尾。

如果读者到达流的末尾,方法readLine将返回null。您在第一个null循环(退出之前)中点击此点(for),具体取决于文本文件中的行数。

答案 2 :(得分:0)

如果hexlibrary.txt的第一行(或任何行)为空或未由“,”s分隔,则split()返回的String数组可能为null。 要检查这一点,只需在第二个for循环周围添加一个if条件,如下所示: if (temp == null) { /* your loop here */ }