Java 跳过try-catch语句?
我正在做一个刽子手游戏,最近实现了一种文件读取方法,可以将单词随机化;然而,在随机分配文件读取器读取的行之前,我没有测试文件读取器,我的代码似乎跳过了try-catch块? 以下是使用此方法的构造函数的行:Java 跳过try-catch语句?,java,Java,我正在做一个刽子手游戏,最近实现了一种文件读取方法,可以将单词随机化;然而,在随机分配文件读取器读取的行之前,我没有测试文件读取器,我的代码似乎跳过了try-catch块? 以下是使用此方法的构造函数的行: word = determineWord(); 方法如下: String determineWord() { String fileName = "HangmanWords.txt"; String line = null; try { File
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。您的
而循环不正确。它的post条件是line==null
,这正是程序每次离开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;
}
令人惊讶的是,这个过程有些棘手,除非您预先知道文本文件中有多少行。有关如何统一执行此操作的信息,请参阅。您的while
循环不正确。它的post条件是line==null
,这正是程序每次离开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;
}
令人惊讶的是,这个过程有些棘手,除非您预先知道文本文件中有多少行。有关如何以统一方式执行此操作的信息,请参阅。在将文件结尾null指定给要返回的行之后,您将读取两次。您可以在阅读前进行检查,也可以只阅读一次
while(bufferedReader.readLine().hasNext()) {
line = bufferedReader.readLine();
}
在将文件结尾null分配给要返回的行之后,您将读取两次。您可以在阅读前进行检查,也可以只阅读一次
while(bufferedReader.readLine().hasNext()) {
line = bufferedReader.readLine();
}
您的while循环每次迭代读取2行
while((line = bufferedReader.readLine()) != null) {
line = bufferedReader.readLine();
}
不要在循环体中再次读取行()
String line = null;
while((line = bufferedReader.readLine()) != null) {
// do something about the line
}
您的while循环每次迭代读取2行
while((line = bufferedReader.readLine()) != null) {
line = bufferedReader.readLine();
}
不要在循环体中再次读取行()
String line = null;
while((line = bufferedReader.readLine()) != null) {
// do something about the line
}
您的代码是错误的:它在每次迭代中读取两行而不是一行,然后返回一行,该行始终为空,因为这是循环停止的条件。代码应该类似于
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;
}
}
您的代码是错误的:它在每次迭代中读取两行而不是一行,然后返回一行,该行始终为空,因为这是循环停止的条件。代码应该类似于
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;
}
}
它不会跳过try-catch块。但在每次迭代中读取两行,并且返回line的最终值,该值始终为null,因为当line为null时循环停止。不确定您想做什么。@JBNizet while循环检查并查看是否还有另一行要读。行应作为文件中的最后一行返回。它不会跳过try-catch块。但在每次迭代中读取两行,并且返回line的最终值,该值始终为null,因为当line为null时循环停止。不确定您想做什么。@JBNizet while循环检查并查看是否还有另一行要读。行应该作为文件中的最后一行返回。我最后在循环中放入finalLine=Line并返回它。谢谢你的回答!捕获异常根本不是一个好的约定。这实际上是非常糟糕的做法。您应该只捕获您能捕获并打算处理的异常。谢谢你的回答!捕获异常根本不是一个好的约定。这实际上是非常糟糕的做法。您应该只捕获您可以并打算处理的异常。