Чтобы добавить к другим ответам: исключения могут выполнять ряд заданий. Слишком часто они говорят вам, что ваша программа безнадежно нестабильна и должна немедленно закрыться.
Обычно они сообщают вам, что случилось что-то плохое и неожиданное, и дают вам возможность объяснить проблему пользователю, а затем продолжить. Например, неожиданное исключение конца файла. Вы можете сказать пользователю, что файл плохой, и позволить ему попробовать другой. Вы также можете распечатать трассировку стека, чтобы они могли вам позвонить и выяснить, что произошло, даже если вы не распечатали подробное сообщение об ошибке.
Обратите внимание на раздвоение личности этого исключения. Подобно первому типу (обычно экземплярам RunTimeException), они сообщают вам точно, что произошло почти без вашего участия. Тем не менее, Java также заставил вас знать, что IOException может быть брошен, и попытался заставить вас написать приятное сообщение для пользователя. Я всегда был немного озадачен этим. Если я ловлю EOFException, я знаю , где это произошло, и мне не нужна трассировка стека. (Конечно, если я знаю, что EOF не может произойти, я не буду беспокоиться о правильном сообщении пользователю, и трассировка стека, когда это произойдет, будет очень полезна.)
Но есть и третий тип исключения, второй тип предыдущего исключения. Это просто дает вам знать, что произошло нечто совершенно нормальное. Это очень эффективно (если вы настроили его правильно, см. Ниже). И это может быть намного чище, чем возвращать значения в стек вызовов методов. Он позволяет методу, который уже возвращает, скажем, String (с нулевой ссылкой, которая вполне подходит), чтобы предупредить вызывающий метод о специальном условии и, необязательно, предоставить огромные объемы данных об этом условии.
public static class MyEOFException extends EOFException {
// Saves creating a meaningless stack trace.
public Throwable fillInStackTrace() { return this; }
}
// Saves creating a new object every time you use it
public static MyEOFException myEOF = new MyEOFException();
Тогда внутри метода:
try {
for (;;) {
String text = readAStringFromFile( in );
// Do something with text...
}
}
catch (MyEOFException e) {
// Nothing at all needs to be done here.
// Note that MyEOFException COULD have beeen set up with tons of data and
// then a lot of work could be done. (The file might end with binary
// data, for instance, which would be in "e".)
}
Исключение может быть сброшено на много уровней, и оно довольно аккуратно выведет вас из цикла. В большинстве таких случаев это было бы слишком упрощенно. Часто это слишком сложно; блоки try-catch могут раздражать. Что-то вроде:
while (readAStringFromFile( in ));
намного приятнее и быстрее писать, если в readAStringFromFile
есть место, где можно прочитать то, что он прочитал.
В вашем конкретном случае использование таких исключений может быть тем, что ищет ваш профессор. Мой личный опыт показывает, что почти всегда есть лучший способ сделать это, чем с помощью блоков try-catch, но когда они работают, они работают очень хорошо.