Java 跳过try-catch语句?

Java 跳过try-catch语句?,java,Java,我正在做一个刽子手游戏,最近实现了一种文件读取方法,可以将单词随机化;然而,在随机分配文件读取器读取的行之前,我没有测试文件读取器,我的代码似乎跳过了try-catch块? 以下是使用此方法的构造函数的行: word = determineWord(); 方法如下: String determineWord() { String fileName = "HangmanWords.txt"; String line = null; try { File

我正在做一个刽子手游戏,最近实现了一种文件读取方法,可以将单词随机化;然而,在随机分配文件读取器读取的行之前,我没有测试文件读取器,我的代码似乎跳过了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。

您的
循环不正确。它的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并返回它。谢谢你的回答!捕获异常根本不是一个好的约定。这实际上是非常糟糕的做法。您应该只捕获您能捕获并打算处理的异常。谢谢你的回答!捕获异常根本不是一个好的约定。这实际上是非常糟糕的做法。您应该只捕获您可以并打算处理的异常。