尝试循环txt文件内容会产生错误

时间:2016-03-16 22:30:45

标签: android for-loop text fileinputstream

我正在尝试遍历许多文本文件,并使用每个文件中的前25个字符创建一个数组。如果文件不存在,我还希望将单词empty放入。我认为我的代码可行,但我似乎遇到了一些问题。你能仔细阅读并看看可能出现的问题吗?

try {



        // Loop through files
         List<String>[] results = new List[filenamearray.length];

          for (int i = 0; i < filenamearray.length; i++) {

        File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[0] + ".txt");
        if (txt.exists()) {

            // Open the file with a FileReader
            txtread = new FileInputStream(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[0] + ".txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(txtread));
            String text = reader.readLine();
            displaytxt = text.substring(0, 25) + "...";

                results[i].add(displaytxt);

        } else {
            Log.i(TAG, "file does not exists");

            results[i].add("empty");

        }
    }


        finalarrangedlist = new ArrayList<>(filenamearray.length);
        for (List<String> result : results) {
            if (result != null) {
                finalarrangedlist.addAll(result);
            }else{Log.i(TAG, "result is null");}
        }
        finalversetextarray = new String[finalarrangedlist.size()];
        finalversetextarray = finalarrangedlist.toArray(finalversetextarray);

    } catch (Exception e) {
        e.printStackTrace();
    }

我得到的错误是:

W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

2 个答案:

答案 0 :(得分:1)

你的代码非常错误。首先,你没有为你的目录上的每个文本文件循环,但只有一个文件。 看看这一行

    File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[0] + ".txt");

应该是

    File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[i] + ".txt");

和第二个错误。你创建了一个List数组,但在访问它时,你没有创建它的实例。从访问它开始它应该是nullpointerexception。看看这一行

     List<String>[] results = new List[filenamearray.length];

并在此行中访问

 results[i].add(displaytxt);

你得到一个空指针异常,因为结果索引&#34; i&#34;是空的。

我修改了您的代码,尝试使用(我还没试过,但它可以帮助您解决问题)

try {

    // Loop through files

    //you only need to use one arraylist to be able to store all the result from reading your files
    List<String> results = new ArrayList<String>();
    for (int i = 0; i < filenamearray.length; i++) {

        File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[i] + ".txt");
        if (txt.exists()) {

            // Open the file with a FileReader
            txtread = new FileInputStream(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[i] + ".txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(txtread));
            String text = reader.readLine();
            displaytxt = text.substring(0, 25) + "...";

            results.add(displaytxt);

        } else {
            Log.i(TAG, "file does not exists");

            results.add("empty");

        }
    }
    //this line of code I comment because it's not efficient
    /*
    finalarrangedlist = new ArrayList<>();
    for (List<String> result : results) {
        if (result != null) {
            finalarrangedlist.addAll(result);
        }else{Log.i(TAG, "result is null");}
    }
    finalversetextarray = new String[finalarrangedlist.size()];
    finalversetextarray = finalarrangedlist.toArray(finalversetextarray);
    */

    //just make results to an array string
    finalversetextarray = new String[results.size()];
    finalversetextarray = results.toArray(finalversetextarray);
} catch (Exception e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

列表已初始化,但表中的所有列表均为空。您必须先在posistion i初始化List,然后才能将对象添加到存储在表的位置i中的List

if(results[i]==null){
   results[i] = new List<String>();
}
results[i].add(displaytxt); 

这应该有效

如果您只需要添加一个字符串,那么您也不需要整个列表。使用List而不是List []