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 не генерирует исключение, поскольку пользователь может ввести недопустимое имя файла.

Спасибо за любую помощь.

EDIT: изменил FileNotFoundException на NullPointerException, и это устранило первую проблему. Теперь, однако, я получаю сообщение об ошибке, что мой оператор return создает незарегистрированное исключение FileNotFoundException. Но этот код не будет выполняться, если файл недействителен, верно? Является ли Java слепой к этому и требует, чтобы я все равно поймал исключение?


person Logan Kirkland    schedule 31.10.2014    source источник


Ответы (5)


документация ясно указывает, что конструктор File(String pathname) может генерировать только NullPointerException, а НЕ FileNotFoundException.

Если вы хотите проверить правильность имени файла, используйте f.exists().

person Gabriel Negut    schedule 31.10.2014

FileNotFoundException не вызывается Scanner#nextLine (), ни путем создания нового объекта File (File#new(String)). Обе функции не делают ничего, что связано с файловым вводом-выводом.

  • Scanner.nextLine() работает с уже существующим источником ввода
  • File#new() создает просто новый объект File, который указывает (имя файла) на (возможно, существующий) фактический файл.

Создание новый объект Scanner, напротив, предполагает создание нового объекта InputStream, поэтому он фактически касается предоставленного файла, открывая его.

Из java.util.Scanner:

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

 return new Scanner(f);

выдает ошибку, когда файл не найден, он не может вернуть scanner(f) . поэтому должен быть заключен в блок try-catch.

или вам нужно сделать getInputScanner, чтобы бросить FileNotFoundException

person Santhosh    schedule 31.10.2014

File f = new File(fileName);

не создает исключение, если файл не существует. Объект File на самом деле просто имя файла; это не относится к фактическому файлу. Если файл не существует, вы получите исключение при попытке его использования.

new Scanner(f) — это та часть, которая выдает FileNotFoundException.

person user253751    schedule 31.10.2014