我正在制作一个Hangman游戏并且最近实施了一个文件读取方法来随机化该单词;然而,在我测试文件阅读器之前,我没有做得很远,我随机选择它读取哪一行,我的代码似乎跳过了try catch块? 以下是使用此方法的构造函数中的行:
word = determineWord();
以下是方法:
String determineWord() {
String fileName = "HangmanWords.txt";
String line = null;
try {
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null) {
line = bufferedReader.readLine();
}
bufferedReader.close();
}
catch(FileNotFoundException ex) {
System.out.println("Can't open file");
}
catch(IOException ex) {
System.out.println("Error reading file");
}
return line;
}
我收到的错误是NullPointerException,我相信因为line最初设置为null,而且我的程序中的word不能为null。
答案 0 :(得分:2)
你的while循环每次迭代读取2行。
while((line = bufferedReader.readLine()) != null) {
line = bufferedReader.readLine();
}
在循环体中再次没有readLine()
String line = null;
while((line = bufferedReader.readLine()) != null) {
// do something about the line
}
答案 1 :(得分:1)
您的while
循环不正确。它的后置条件为line == null
,这正是您的程序每次都离开line
的状态。
您应该创建一个单独的变量,并将其设置为文件中的某个随机line
。
这是一种简单的方法,它不是统一的:
private Random rnd = new Random();
String determineWord() {
String fileName = "HangmanWords.txt";
String res = null;
try {
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = null;
int count = 1;
while((line = bufferedReader.readLine()) != null) {
if (res == null || 4*rnd.nextInt(count) > count) {
res = line;
}
count++;
}
bufferedReader.close();
}
catch(FileNotFoundException ex) {
System.out.println("Can't open file");
}
catch(IOException ex) {
System.out.println("Error reading file");
}
return res;
}
令人惊讶的是,除非您事先知道文本文件中有多少行,否则这个过程有点棘手。有关如何以统一方式执行此操作的信息,请参阅reservoir sampling algorithm。
答案 2 :(得分:1)
您正在读取两次,因此在文件结束后将null分配给您要返回的行。您可以在阅读前进行检查或只阅读一次。
while(bufferedReader.readLine().hasNext()) {
line = bufferedReader.readLine();
}
答案 3 :(得分:1)
你的代码是错误的:它在每次迭代时读取两行而不是一行,并返回行,它总是为空,因为这是循环停止的条件。代码应该类似于
String lastReadLine = null;
while((line = bufferedReader.readLine()) != null) {
lastReadLine = line;
}
return lastReadLine;
当出现错误时,我也会避免返回null或一些随机行。如果有异常,你不应该继续,好像没有任何反应。扔掉它而不是抓住它。
无论发生什么,你应该确保读者关闭。这是try-with-resources语句的用途:
String determineWord() throws IOException {
String fileName = "HangmanWords.txt";
try (FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line = null;
String lastReadLine = null;
while((line = bufferedReader.readLine()) != null) {
lastReadLine = line;
}
return lastReadLine;
}
}