尝试遍历 txt 文件内容会出错
Trying to loop through txt file contents gives error
我正在尝试遍历许多文本文件并用每个文件的前 25 个字符创建一个数组。如果文件不存在,我还想输入空这个词。我认为我的代码可以工作,但我似乎 运行 遇到了一些问题。你能通读一下看看有什么问题吗?
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
你的代码是非常错误的。首先,您不是对目录中的每个文本文件进行循环,而只是对一个文件进行循环。
看看这一行
File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[0] + ".txt");
应该是
File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[i] + ".txt");
还有第二个错误。你制作了一个列表数组,但在访问它时,你没有制作它的实例。从您访问它开始,它应该是一个空指针异常。看看这一行
List<String>[] results = new List[filenamearray.length];
当你在这一行访问它时
results[i].add(displaytxt);
您得到一个空指针异常,因为索引 "i" 中的结果为空。
我修改了你的代码,尝试使用(我还没有尝试这个,但它可以帮助你解决你的问题)
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();
}
Lists的table已经初始化,但是table里面的所有Lists都是空的。您必须先在位置 i 初始化列表,然后才能将对象添加到存储在 table
的位置 i 中的列表
if(results[i]==null){
results[i] = new List<String>();
}
results[i].add(displaytxt);
这应该有效
此外,如果您只需要添加一个字符串,则不需要整个列表。使用 List 而不是 List[]
我正在尝试遍历许多文本文件并用每个文件的前 25 个字符创建一个数组。如果文件不存在,我还想输入空这个词。我认为我的代码可以工作,但我似乎 运行 遇到了一些问题。你能通读一下看看有什么问题吗?
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
你的代码是非常错误的。首先,您不是对目录中的每个文本文件进行循环,而只是对一个文件进行循环。 看看这一行
File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[0] + ".txt");
应该是
File txt = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC) + "/" + filenamearray[i] + ".txt");
还有第二个错误。你制作了一个列表数组,但在访问它时,你没有制作它的实例。从您访问它开始,它应该是一个空指针异常。看看这一行
List<String>[] results = new List[filenamearray.length];
当你在这一行访问它时
results[i].add(displaytxt);
您得到一个空指针异常,因为索引 "i" 中的结果为空。
我修改了你的代码,尝试使用(我还没有尝试这个,但它可以帮助你解决你的问题)
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();
}
Lists的table已经初始化,但是table里面的所有Lists都是空的。您必须先在位置 i 初始化列表,然后才能将对象添加到存储在 table
的位置 i 中的列表if(results[i]==null){
results[i] = new List<String>();
}
results[i].add(displaytxt);
这应该有效
此外,如果您只需要添加一个字符串,则不需要整个列表。使用 List 而不是 List[]