跳过try catch语句?

时间:2016-04-06 20:30:18

标签: java

我正在制作一个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。

4 个答案:

答案 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; 
    }
}