Почему размещение моего файла в try-catch с FileNotFoundException сработало при чтении файла?

Мой код работает для выполнения задания, но мне не поможет, если я не знаю, почему это произошло, поэтому я здесь, чтобы попытаться понять, спросив сообщество.

Я пытаюсь прочитать простой текстовый файл из трех строк, каждая из которых содержит одно предложение lorem ipsum. Ничего сумасшедшего. Имя файла — myFile.txt, и мой класс Java находится в той же папке. Пути ведут к одной и той же папке, в которой находятся оба файла. Java продолжала сообщать мне, что не может найти мой файл, хотя файл находится в той же папке.

Изначально у меня было такое.

    public void readFile()  {
        File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
        Scanner myReader = new Scanner(file);

        while (myReader.hasNextLine()) {
            System.out.println(myReader.nextLine());
        }
    }

Затем VScode Code предложил мне сделать это вместо быстрого исправления.

    public void readFile()  {
        File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
        try (Scanner myReader = new Scanner(file)) {
            while (myReader.hasNextLine()) {
                System.out.println(myReader.nextLine());
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

После быстрого исправления файл прочитан точно так, как есть.

Может кто-нибудь объяснить, почему код сработал после того, как он был помещен в try/catch?

🤔 А знаете ли вы, что...
Java поддерживает аннотации для добавления метаинформации в код.


77
1

Ответ:

Решено

Java может быть довольно строгим в отношении перехвата исключений. Компилятор знает, что new Scanner(File source) может выдать FileNotFoundException, поэтому он позволит вам скомпилировать код только в том случае, если вы примете это во внимание.

Если бы это позволяло вам компилировать, вы могли бы получить довольно неприятные побочные эффекты. Кто-то другой может попытаться использовать ваш метод и получить ошибку, даже не осознавая, что ему нужно беспокоиться, что может вызвать большое разочарование или замешательство.

Java предоставляет вам несколько вариантов решения этой проблемы:

  1. Перехват или обработка случая возникновения исключения. Это то, что вы сделали. Блок try/catch сообщает компилятору, что вы знаете, что исключение возможно, и что вы с ним справитесь, если оно произойдет. Если вы собираетесь перехватить исключение, вам, вероятно, следует что-то с ним сделать, а не просто распечатать его, чтобы предотвратить непредвиденное поведение в дальнейшем.
  2. Объявление или сообщение компилятору о том, что метод может вызвать исключение. Это передает исключение тому, кто его вызывает. Это может быть полезно, поскольку позволяет пользователям адаптировать обработку исключений к своим сценариям использования. Если вы хотите сделать это, удалите блок try/catch и добавьте вместо него оператор throws:
public void readFile() throws FileNotFoundException {
    File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
    Scanner myReader = new Scanner(file);
    while (myReader.hasNextLine()) {
        System.out.println(myReader.nextLine());
    }
}

Ключевое слово throws сообщает компилятору, что ваш метод потенциально может выдать данное исключение, что заставит компилятор других быть осторожными с вашим методом так же, как он заставил вас быть осторожными с этим.

Это справедливо не для всех исключений. Как отметил @Rifat, это применимо только к проверенным исключениям; непроверенные исключения не нужно обрабатывать так явно.