Я думал, что IOException и FileNotFoundException точно такого рода исключений
Нет, те, на самом деле являются «другой» тип исключения, те, которые выходят за рамки ваших навыков программирования. Независимо от того, насколько хорошо вы программируете, компилятор и библиотеки заставляют вас быть «сознательными», что что-то может случиться.
Подумайте об этом сценарии:
Вы создаете приложение, которое сохраняет данные в папку темп.
Все в порядке, вы проверили, существует ли папка, а если нет, вы создаете ее самостоятельно.
А затем вы пишете 2 мб в эту временную папку.
Внезапно другой системный процесс удаляет временную папку, и вы больше не можете писать.
Нет ничего, что можно было бы сделать, чтобы предотвратить это программно, в некоторых системах, которые могут произойти (в unix пользователь root может выполнять rm -rf/tmp, и вы ничего не можете с этим поделать. система не позволит другому процессу удалить файл, который используется)
Заставляя вас проверять такие исключения в коде, разработчики платформ думали, что, по крайней мере, вы об этом знаете.
Jon is correct иногда нет ничего, что вы можете сделать об этом, вероятно, ведение журнала, прежде чем умирает программа, которая рассматривается как «обработать исключение» (бедные ручки да, но обращаться по крайней мере)
try {
....
} catch(IOException ioe) {
logger.severe(
String.format("Got ioe while writting file %s. Data was acquired using id = %d, the message is: %s",
fileName,
idWhereDataCame,
ioe.getMessage()));
throw ioe;
}
Другое дело вы можете сделать это, чтобы «объединить» исключение, чтобы соответствовать абстракции.
Возможно, ваше приложение имеет графический интерфейс, отображающий IOException для пользователя, не будет означать ничего или может быть security vulnerability. Модифицированное сообщение может быть отправлено.
try {
....
} catch(IOException ioe) {
throw new EndUserException("The operation you've requeste could not be completed, please contact your administrator" , ioe);
}
И EndUserException может оказаться в ловушке где-то в графическом интерфейсе и представлена пользователю в диалоговом окне (вместо того, чтобы просто исчезнуть приложение в его глазах без дополнительной информации). Конечно, вы ничего не смогли сделать, чтобы восстановить это IOException, но по крайней мере вы умираете со стилем: P
Наконец, код клиента может использовать разные реализации, и не все исключения будут иметь смысл.
Например, подумайте еще раз о первом сценарии. Эта же «операция» может иметь три вида «плагинов» для выполнения сохранения данных.
a) Write the data to a file.
b) Or, write to a db
c) Or write to a remote server.
Интерфейс не должен бросать:
java.io.IOException
java.sql.SQLException
ни
java.net.UnknownHostException
Но вместо того, что-то вроде
my.application.DataNotSavedException
и различных реализаций будет обрабатывать исключение при правильной L Evel, и преобразовать его в соответствующий абстракции:
код клиента: код
DataSaver saver = DataServer.getSaverFor("someKeyIdString");
try {
saver.save(myData);
} catch(DataNotSavedException dnse) {
// Oh well... .
ShowEndUserError("Data could not be saved due to : " dnse.getMessage());
}
осуществления:
class ServerSaver implements DataSaver {
....
public void save(Data data) throws DataNotSavedException {
// Connect the remore server.
try {
Socket socket = new Socket(this.remoteServer, this.remotePort);
OuputStream out = socket.getOut....
....
....
} catch (UnknownHostException uhe) {
// Oops....
throw new DataNotSavedException(uhe);
}
}
}
FileSaver и DatabaseSaver бы сделать что-то подобное.
Все это Проверенные исключения, потому что компилятор заставляет вас проверить их.
Когда использовать один или другой (проверено/снят): here
Есть два других вида: here
И, наконец, гораздо проще объяснение среды выполнения: here
Очень хороший момент, и хороший ответ. – hotshot309