Я знаю, что FileNotFound - это проверенное исключение, но, хотя это так, это исключение произойдет только во время выполнения. Это больше похоже на арифметическое исключение (не отмечено).

Независимо от того, отмечен он или нет, исключение произойдет только во время выполнения.

Мой вопрос: почему мы называем материалы, связанные с FileNotFound/IO/DB, как проверенное исключение?

Поделитесь, пожалуйста, своими ценными мыслями :)

14
Lathy 6 Мар 2015 в 12:47

5 ответов

Лучший ответ

Исключения всегда встречаются только во время выполнения. Разница возникает при обработке исключения.

Отмеченный или не отмеченный флажком означает, будет ли он выполняться принудительно во время компиляции, или он будет идентифицирован только при обнаружении во время выполнения.

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

Во время обработки файла компилятор не проверяет, присутствует ли файл или нет, он просто проверяет, обработали ли вы исключение fileNotFoundException или нет, потому что, когда вы имеете дело с файлом, шансы встретить это исключение очень высоки, и вы должны обработать его в своем код. для арифметического исключения нет способа найти его во время компиляции. и поэтому он не отмечен.

13
Kavan 27 Май 2015 в 06:01

Отмеченные исключения вынуждают пользователей явным образом обрабатывать их, они используются для «восстанавливаемых» исключений, когда пользователь может корректно справиться с ситуацией.

Возьмем FileNotFound - обычно он выдается, когда файл отсутствует, и ниже приводится связанная с ним идиома программирования:

FileInputStream fis = null;
try {
    fis = new FileInputStream(new File(""));
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    try {
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Здесь проверенное исключение заставляет меня объявить его в блоке try / catch, где я могу аккуратно закрыть fis, даже если есть исключение.

Теперь представьте, что FileNotFound - исключение времени выполнения, код гипотетически будет выглядеть так:

FileInputStream fis = null;
fis = new FileInputStream(new File(""));
fis.close();

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

0
Saum 13 Дек 2017 в 12:19

Они позволили этому исключению быть проверенным, потому что пользователь может «восстановиться» после этого исключения, обработав его. Например, пользователь может указать другой каталог в случае возникновения этого исключения.

2
isah 25 Май 2015 в 08:44

Все исключения могут происходить только во время выполнения :) Разница между исключениями Checked и Unchecked в том, что компилятор заставляет вас обрабатывать checked исключения или добавлять их в сигнатуру метода, фактически заставляя вызывающего сделать то же самое (обработать / перебросить).

2
Svetlin Zarev 25 Май 2015 в 08:31

NullPointerException или ArithmeticException обычно не должно происходить в законченной правильной программе. Вы можете справиться с ними, просто проверив перед этим с помощью if, чтобы увидеть, если вы делите на 0 или объект равен null, и тогда вы уверены, что это исключение не будет создано. Каждый раз обработка этих исключений может сделать код менее читабельным.

Теперь вы можете утверждать, что вы можете сделать то же самое для FileNotFoundException, просто проверив, существует ли файл, прежде чем что-либо делать. Но многие конструкторы или методы, которые ожидают File, также поддерживают String, из которого затем создается файл. Думаю, это вопрос того, где вы проводите линию, если у вас всегда есть только метод File и никогда не поддерживает String, то я бы добавил его и к непроверенным методам, я думаю.

Другими словами: если выбрано FileNotFoundException, то это может быть желаемое поведение и управлять потоком вашей программы, но NullPoinerException действительно не следует использовать для этого.

3
maraca 25 Май 2015 в 09:09