为什么编译器说有一个不可拆卸的catch块?

时间:2016-11-23 19:34:41

标签: java try-catch

我正在尝试在方法中打开文件时第一次使用try块。我使用扫描仪将文件中的单词读入ArrayList,然后从该列表中返回一个随机单词。问题是,当我编译时,编译器说有一个无法访问的catch块。我不确定这是由代码本身引起的,还是由于我把返回语句放在哪里引起的。我是否在try块中放置了打开文件的代码,并在catch块之后保留返回随机选择的字符串的代码?或者我将文件代码和返回字符串的代码放在try块中?

public String loadPuzzle() {
    try {
        ArrayList<String> puzzles = new ArrayList<String>();
        Scanner sc = new Scanner(new File("Categories.txt"));
        while (sc.hasNext()) {
            String line = sc.nextLine();
            puzzles.add(line);
        }
        sc.close();
        //do i do the return statement here or after the try and catch blocks?
        int r = new Random().nextInt(puzzles.size() + 1);
        return puzzles.get(r);
    } 
    catch(FileNotFoundException e) {
        System.out.println("The file was not found.");
        return "";
      // do i need to return a value in the catch blocks?
    }
    //the compiler throws the warning here: unreachable catch clause and FileNotFoundException already found
    catch(IOException e) {
        System.out.println(e);
        return "";
    }
}

2 个答案:

答案 0 :(得分:4)

编译器绝对正确。第二个catch子句无法访问,因为您的代码不能抛出IOException而不是FileNotFoundException

在您放置代码的第二部分时,这并不重要。我更喜欢把它放在catch子句中。

并且您不需要在catch子句中放置return语句,但是当它返回类似错误代码的内容时。我会在方法的最后添加一个返回

答案 1 :(得分:0)

因为从您的try块抛出的最高异常是FileNotFoundException所以在IOException

之后无法捕获FileNotFoundException