try и catch в Java
Оберните плохое чтение slots[5] в try и catch, чтобы программа не завершилась на ArrayIndexOutOfBoundsException. Напечатайте blocked внутри catch, затем after вне обоих блоков. Скомпилируйте Guard.java и запустите java Guard. Экран должен показать blocked, затем after. Второй файл держит slots[0] внутри try, чтобы catch был пропущен и экран показал 2, затем after. Оставьте throw следующей странице.
Поймать плохой индекс
Страница исключений показала: печать slots[5] на {2, 4} бросает ArrayIndexOutOfBoundsException и останавливает запуск. Эта страница сохраняет ту же историю массива и добавляет обработку. Откройте новый учебный файл Guard.java. Оставьте имя публичного класса Guard, чтобы оно совпало с именем файла. Удалите оставшиеся main из Alarm без catch, списки Integer из Crate и любой Scanner или nextLine. Программа не должна ждать ввода.
Внутри main оставьте тот же маленький массив:
int[] slots = {2, 4};
Положите плохую печать в try:
System.out.println(slots[5]);
Затем напишите catch, который называет ArrayIndexOutOfBoundsException и печатает blocked. После всего try и catch напечатайте after. Имя параметра catch может быть короткой буквой вроде e; объект исключения на этой странице печатать не нужно.
public class Guard {
public static void main(String[] args) {
int[] slots = {2, 4};
try {
System.out.println(slots[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("blocked");
}
System.out.println("after");
}
}
Из папки с Guard.java выполните javac Guard.java. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет свою строку. Затем выполните java Guard — не java Guard.java. Уберите окончание .java из команды запуска.
Экран показывает blocked, затем after. Плохой индекс по-прежнему бросает внутри try. Catch обрабатывает это именованное исключение и печатает blocked. Строка System.out.println("after"); снаружи, поэтому тоже выполняется. Программа не заканчивается на этой остановке, как голый плохой файл Alarm.
Представьте вторую печать всё ещё внутри того же try после slots[5], например строку, которая напечатала бы rice. Эта строка не выполняется. Поймать исключение — не значит вернуться и доделать остаток try. Только тело catch работает для этой остановки, затем управление продолжается после catch. Держите мысль ясной: обработка пропускает оставшиеся строки внутри try после точки броска.
Если терминал ждёт ввод с клавиатуры, в файле ещё есть вызов nextLine из старого упражнения. Удалите его. Если видите только отчёт стека без строки blocked, catch отсутствует или имя исключения не совпадает. Если видите только 2 без after, возможно всё ещё запускаете старый безопасный Alarm — перейдите к java Guard с учебным файлом catch.
Когда try завершается, catch молчит
Вторая программа использует ту же форму try и catch, но печать внутри try просит записанный слот: slots[0]. Каждая строка внутри try завершается. Тело catch не выполняется.
public class Guard {
public static void main(String[] args) {
int[] slots = {2, 4};
try {
System.out.println(slots[0]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("blocked");
}
System.out.println("after");
}
}
Скомпилируйте через javac Guard.java, затем запустите java Guard. Экран показывает 2, затем after. Слово blocked не печатается, потому что не было ArrayIndexOutOfBoundsException. Catch остался тихим. Строка after всё равно выполняется, потому что она вне обоих блоков — то же место, что в демо catch.
Пройдите контраст один раз. Первый файл: плохой индекс, catch печатает blocked, затем after. Второй файл: безопасный индекс, catch пропущен, экран 2 затем after. Оба держат Guard и то же имя типа catch. Меняется только индекс внутри try. Одного этого изменения достаточно, чтобы увидеть, когда catch работает, а когда нет.
Не придумывайте throw на этой странице. Вы ловите исключение, которое уже вызывает плохое чтение массива. Следующая страница — о намеренном броске. Также не оборачивайте сегодня каждую тихую печать курса в try — этот урок использует try там, где известный плохой индекс нуждается в обработанном пути.
Имя catch должно совпадать
Предложение catch называет один тип исключения. На этой странице это ArrayIndexOutOfBoundsException, совпадающий с плохим индексом. Если вокруг slots[5] написать catch (NullPointerException e), такой catch не обработает остановку. Программа всё равно завершится с ArrayIndexOutOfBoundsException, и ни blocked, ни after не напечатаются для этого несовпадающего catch. Держите совпадающий тип в учебных файлах.
В Java есть и другие имена исключений. Эта страница остаётся на одной ясной паре: плохой индекс массива и ArrayIndexOutOfBoundsException. Перед практикой этой формы не нужен каталог всех ловимых типов. Совпадайте с именем, которое видели на странице исключений.
Сравнение с голой остановкой Alarm
На странице исключений java Alarm с slots[5] остановился и показал отчёт стека. На этой странице java Guard с тем же плохим индексом печатает blocked и продолжает до after. История массива не изменилась. Обработка изменилась. Держите файлы Alarm только как историю, если они ещё рядом; для демо catch запускайте java Guard, чтобы экран совпал с этим уроком.
История wrappers всё ещё печатает 9 из списка Integer, если сохранить тот старый файл. Этот путь — не история catch. Удалите или игнорируйте оставшиеся демо ArrayList<Integer> внутри Guard.java, чтобы учебный файл остался на int[] slots плюс try и catch.
Что эта страница оставляет для throwing
Эта страница ловит исключение, с которым строка уже сталкивается. Следующая страница вводит throw, чтобы вы сами сигнализировали о проблеме. Оставайтесь здесь с совпадающим catch и продолжением after. Пока не добавляйте ручной throw как требование к этим файлам Guard.
Перед throwing
Вы можете поймать ArrayIndexOutOfBoundsException от slots[5] и увидеть blocked, затем after. Вы можете держать slots[0] внутри try и увидеть 2, затем after, с пропущенным catch. Скомпилируйте Guard.java и по очереди запускайте java Guard для каждой сохранённой демо. Имя catch совпало с остановкой плохого индекса. Следующая страница — throwing, где вы намеренно вызываете остановку.
Держите демо catch для обработанного пути. Держите безопасный try для тихого пропуска catch. Держите ручной throw вне этой страницы. Эти три привычки — контрольная точка перед продолжением. Когда после запуска плохого индекса java Guard появятся сначала blocked, затем after, try и catch сделали свою работу для этого урока, и вы готовы к следующей теме о броске.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху