Мой код работает для выполнения задания, но мне не поможет, если я не знаю, почему это произошло, поэтому я здесь, чтобы попытаться понять, спросив сообщество.
Я пытаюсь прочитать простой текстовый файл из трех строк, каждая из которых содержит одно предложение 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 поддерживает аннотации для добавления метаинформации в код.
Java может быть довольно строгим в отношении перехвата исключений. Компилятор знает, что new Scanner(File source)
может выдать FileNotFoundException
, поэтому он позволит вам скомпилировать код только в том случае, если вы примете это во внимание.
Если бы это позволяло вам компилировать, вы могли бы получить довольно неприятные побочные эффекты. Кто-то другой может попытаться использовать ваш метод и получить ошибку, даже не осознавая, что ему нужно беспокоиться, что может вызвать большое разочарование или замешательство.
Java предоставляет вам несколько вариантов решения этой проблемы:
try/catch
сообщает компилятору, что вы знаете, что исключение возможно, и что вы с ним справитесь, если оно произойдет. Если вы собираетесь перехватить исключение, вам, вероятно, следует что-то с ним сделать, а не просто распечатать его, чтобы предотвратить непредвиденное поведение в дальнейшем.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, это применимо только к проверенным исключениям; непроверенные исключения не нужно обрабатывать так явно.