Загрузка...

Генерация исключений в Java

Напишите сами остановку через throw. Откройте Signal.java и бросьте IllegalArgumentException с сообщением empty до любой печати water. Скомпилируйте javac Signal.java и запустите java Signal. Программа останавливается на строке throw; water не печатается. Вторая демонстрация ставит cups в 0, чтобы вошёл if и произошёл бросок. Третья ставит cups в 3, чтобы if пропустили и экран напечатал water. Чтение файлов оставьте на следующую страницу.

Вы пишете остановку

На прошлых страницах остановка появлялась, когда строка нарушала правило — плохой индекс массива бросал ArrayIndexOutOfBoundsException. Эта страница — другая сторона. Вы выбираете тип исключения и пишете throw, чтобы остановка была намеренной. Откройте учебный файл Signal.java. Держите публичное имя класса Signal, чтобы совпадало с файлом. Удалите оставшиеся catch-демо Guard, остановки массива Alarm и любой Scanner или nextLine. Программа не должна ждать ввод с клавиатуры. Этой странице не нужна строка import.
В main бросьте до любой спокойной печати успеха:
throw new IllegalArgumentException("empty");
Затем оставьте печать, которая не должна выполняться при срабатывании throw:
System.out.println("water");
Слова в кавычках — сообщение. Имя типа — IllegalArgumentException. Вы не делите на ноль и не читаете slots[5]. Остановка есть потому, что вы написали throw.

Signal bare throw stops before water

java
public class Signal {
    public static void main(String[] args) {
        throw new IllegalArgumentException("empty");
        // water would not run after throw
    }
}

Из папки с Signal.java выполните javac Signal.java. Когда скобки, фигурные скобки и точки с запятой сходятся, javac не пишет свою строку. Затем java Signal — не java Signal.java. Уберите окончание .java из команды запуска.
Запуск останавливается на строке throw. Терминал называет IllegalArgumentException и показывает сообщение empty. Печать water после этого throw не выполняется, потому что программа уже остановилась. Если оставите недостижимый System.out.println("water"); после throw в том же main, некоторые компиляторы предупреждают о недостижимом коде; учебная идея та же: после throw обычные строки этого пути не выполняются. Предпочитайте голый throw без мёртвой печати, если javac жалуется — сама остановка и есть урок.
Если терминал ждёт клавиатуру, в файле остался вызов nextLine из старого упражнения. Удалите его. Если видите blocked затем after, вы всё ещё запускаете catch-файл Guard — переключитесь на java Signal. Если видите ArrayIndexOutOfBoundsException от slots[5], активен остаток Alarm; замените строкой throw для этого урока.

Ноль cups входит в if и бросает

Вторая программа начинается заново. Сохраните cups как 0. Если cups меньше 1, бросьте ту же IllegalArgumentException с сообщением empty. Оставьте печать water после if.

Signal zero cups throws

java
public class Signal {
    public static void main(String[] args) {
        int cups = 0;
        if (cups < 1) {
            throw new IllegalArgumentException("empty");
        }
        System.out.println("water");
    }
}

Скомпилируйте javac Signal.java, затем запустите java Signal. Ноль меньше единицы, поэтому входят в if и выполняется throw. Экран показывает ту же остановку: IllegalArgumentException и empty. Слово water не печатается. На этой странице никто не ловит остановку, программа заканчивается там. Это намеренно — прошлая страница тренировала catch; эта тренирует написание throw.
Пройдите фигурные скобки один раз. Строка throw внутри блока if. Печать water вне if. Когда выполняется throw, программа уже остановилась, water недостижим. Отступы и скобки помещают throw внутрь проверки.

Три cups пропускают throw и печатают water

Третья программа тоже начинается заново. Установите cups в 3. Сохраните тот же if, тот же throw и ту же печать water.

Signal three cups prints water

java
public class Signal {
    public static void main(String[] args) {
        int cups = 3;
        if (cups < 1) {
            throw new IllegalArgumentException("empty");
        }
        System.out.println("water");
    }
}

Снова скомпилируйте и запустите javac Signal.java и java Signal. Три не меньше единицы, поэтому в if не входят. throw никогда не выполняется. Экран печатает water. Остановки нет. Этот контраст — контрольная точка: throw срабатывает только когда условие говорит, что значение непригодно.
Не придумывайте catch вокруг этих учебных файлов на этой странице. Вы уже тренировали catch на Guard. Здесь нужно увидеть остановку, которую написали, и путь, который пропускает throw. Не заменяйте IllegalArgumentException на ArrayIndexOutOfBoundsException для пустых cups — то имя было для плохого индекса, а не для проверки значения, которую вы авторизовали через throw.

Имя, которое вы написали

Тип, который вы бросили, — IllegalArgumentException, не ArrayIndexOutOfBoundsException и не голое слово empty как тип. Сообщение empty — то, что вы выбрали показать рядом с именем. Если позже поймаете эту остановку, в catch должно быть IllegalArgumentException. catch для NullPointerException её не обработает. Тренировка catch сегодня на этих файлах Signal не обязательна.
IllegalArgumentException — исключение времени выполнения в обычном начальном использовании, поэтому этим маленьким демо main не нужна клаузула throws на main. Оставайтесь с этим ясным типом и сообщением. Каталог всех бросаемых классов не нужен, пока следующая страница не откроет файл.

Сравнение с catch на Guard

На странице try-catch java Guard обработал плохой индекс и продолжил до after. На этой странице java Signal намеренно вызывает остановку и не ловит её. История массива — прошлое. Держите файлы Guard только как старые демо, если они рядом; запускайте java Signal для throw-демо, чтобы экран совпадал с уроком.

Что эта страница оставляет для files

Эта страница только показывает, что вы вызываете остановку через throw. Следующая начинает чтение файла. Оставайтесь с написанием остановки и пропуском, когда cups пригоден. Не требуйте открытия файла в этих демо Signal пока.

Перед files

Вы можете бросить IllegalArgumentException("empty") и увидеть остановку до water. При cups 0 входят в if и та же остановка. При cups 3 throw не выполняется и экран печатает water. Скомпилируйте Signal.java и по очереди запустите java Signal для каждой сохранённой демо. Имя этой остановки — IllegalArgumentException. Следующая страница — чтение файла.
Держите голый throw для ясной остановки, которую вы написали. Держите пару cups для условия, которое может пропустить throw. Держите чтение файлов вне этой страницы. Эти три привычки — контроль перед продолжением. Когда water появляется только при запуске cups-три java Signal, throwing выполнил работу урока, и вы готовы к следующей теме о файлах.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
4
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху