FileNotFoundException未被抛出

时间:2014-10-31 06:40:31

标签: java try-catch filenotfoundexception

我正在编写一段代码,用于返回用户输入文件名的扫描程序。这是代码:

public static Scanner getInputScanner(Scanner console) {
    System.out.print("Enter input file: ");
    String fileName = "";
    try {
        fileName = console.nextLine();
        File f = new File(fileName);
    } catch (FileNotFoundException e) {      
        while (!(new File(fileName)).exists()) {
            System.out.println(fileName + " (No such file or directory)");
            System.out.print("Enter input file: ");
            fileName = console.nextLine();
        }
    }
    File f = new File(fileName);
    return new Scanner(f);
}

我遇到两个错误:

Compression.java:49: error: exception FileNotFoundException is never thrown in body of corresponding try statement
    } catch (FileNotFoundException e) {      
      ^
Compression.java:57: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
    return new Scanner(f);

我无法弄清楚为什么try块不会抛出异常,因为用户可能会输入无效的文件名。

感谢您的帮助。

编辑:将FileNotFoundException更改为NullPointerException并修复了第一个问题。但是,现在我得到一个错误,我的return语句抛出了未报告的FileNotFoundException。但是除非文件有效,否则这段代码不会执行,对吧? Java是否对此视而不见,并且要求我抓住异常呢?

5 个答案:

答案 0 :(得分:0)

 return new Scanner(f);

在找不到文件时抛出错误,它无法返回scanner(f)。所以应该包含在try-catch块中。

或者您需要让getInputScanner抛出FileNotFoundException

答案 1 :(得分:0)

The documentation明确指出File(String pathname)构造函数只能抛出NullPointerException而不是FileNotFoundException

如果您想查看文件名是否有效,请使用f.exists()

答案 2 :(得分:0)

File f = new File(fileName);
如果文件不存在,

会抛出异常。 File对象实际上只是一个文件名;它没有引用实际文件。如果该文件不存在,则在尝试使用该文件时会出现异常。

new Scanner(f)是抛出FileNotFoundException的部分。

答案 3 :(得分:0)

Scanner#nextLine()既不会引发FileNotFoundException,也不会创建新的File对象(File#new(String))。这两个函数都不会执行与文件I / O相关的任何操作。

  • Scanner.nextLine()使用已读的现有输入源
  • File#new()只创建一个新的File对象,将(文件名)指向(可能是现有的)实际文件。

相比之下,创建new Scanner object涉及创建新的InputStream,因此它实际上通过打开它来触摸提供的文件。

来自 java.util.Scanner

public Scanner(File source) throws FileNotFoundException {
    this((ReadableByteChannel)(new FileInputStream(source).getChannel()));
}

答案 4 :(得分:0)

在构建Scanner之前,您始终可以调用File.exists(),如果使用无限循环,则可以简化逻辑并消除这些错误。像,

public static Scanner getInputScanner(Scanner console) {
    while (true) {
        System.out.print("Enter input file: ");
        String fileName = console.nextLine();
        File f = new File(fileName);
        if (!f.exists()) {
            System.out.println(fileName + " (No such file or directory)");
            continue;
        }
        try {
            return new Scanner(f);
        } catch (FileNotFoundException e) {
            // This shouldn't happen.
            e.printStackTrace();
            System.out.println(fileName + " (No such file or directory)");
        }
    }
}