Зачем нам нужно ключевое слово throw в Java?

В этот ответ предоставленный код:

void greet(String name) {
    if (name == null) {
        throw new IllegalArgumentException("Cannot greet null");
    }
    System.out.println("Hello, " + name);
}

Подобные примеры я видел на всех сайтах, куда я заходил, чтобы выучить ключевое слово throw. Что для меня не имеет смысла всякий раз, когда я вижу такие примеры, так это почему бы просто не Распечатать: «Cannot greet null» вместо выброс исключения.

Вопросы:

  1. Есть ли лучшие примеры полезности ключевого слова throw? (Я просто собираюсь закончить среднюю школу и знаю только программирование на Java на уровне средней школы, поэтому, пожалуйста, избегайте сложных примеров)

  2. Почему в данном примере пользователь выбрал исключение вместо того, чтобы просто распечатать ошибку?

Это зависит от функциональность кода. Ничего не получится, просто распечатав нулевой

Nicholas K 12.01.2019 08:02

Как сказал Николас, печать может быть полезна в некоторых ситуациях отладки, но создание исключений может помочь программе корректно выйти из строя. Допустим, вы работаете на кухне в пиццерии, и вам говорят приготовить пиццу. Когда вы готовитесь, вы понимаете, что у вас нет бабла. Вы можете пробормотать: «У меня нет теста» и продолжить поливать столик соусом («печать»), или вы можете прекратить то, что вы делаете, и сказать своему менеджеру, что у вас нет теста («бросить / поймать»).

BobtheMagicMoose 12.01.2019 08:07

Что, если код, вызывающий greet, хочет узнать, возникла ли проблема, и снова запросить другое имя?

chrylis -cautiouslyoptimistic- 12.01.2019 08:18

@chrylis. Это вопрос открытия stdout в режиме w + и анализа вывода :)

Mad Physicist 12.01.2019 08:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
730
6

Ответы 6

Ключевое слово Throw используется для уведомления вызывающей стороны о том, что переданный аргумент недействителен (в данном случае) или что что-то пошло не так при выполнении кода, вызванного вызывающей стороной.

Рассмотрим пример, когда вы пишете приложение для онлайн-покупок. Ниже приводится простая последовательность событий:

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

Теперь во время оплаты, если номер карты неверен или у пользователя недостаточно баланса на карте, вы бы вернули ошибку вызывающему абоненту (то есть в приложении для покупок) или просто зарегистрируете ее на консоли (на стороне платежного провайдера) и вернуть ответ? Конечно, первое, так что это просто для того, чтобы вызывающий абонент знал, что есть ошибка, и он должен обработать ее изящно (показывая соответствующее сообщение при оформлении заказа в нашем случае).

Оператор throw внезапно прекращает выполнение текущей функции и возвращает управление обратно вызывающей стороне, заставляя их обработать ошибку или повторно вызвать исключение вверх по цепочке.

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

Оператор печати просто не мог сделать всего этого. Ваш пример уже хороший. Задача функции приветствия - распечатать приветствие. Если вы передадите null, функция не сможет этого сделать. Вывод сообщения здесь может сбить с толку. Вместо этого он заставляет вас иметь дело с тем фактом, что у вас есть недопустимый ввод, вместо того, чтобы печатать доброжелательное сообщение, которое кто-то может принять за приветствие.

Попробуйте Java 8 Optional:

String nullVal = null;
System.out.println(Optional.ofNullable(nullVal).orElseGet(() -> null));

String notNull = "Hello Optional";
System.out.println(Optional.ofNullable(notNull).orElseGet(() -> null));

Метод можно изменить так:

public static void greet(String name) {
    System.out.println("Hello, " + Optional.ofNullable(name).orElseGet(()->null));
}

Пришло время пересмотреть концепцию обработки исключений в Java.

Прежде всего, что является исключением: всякий раз, когда возникает какая-либо ошибка или проблема, возникающая при выполнении строк кода, это называется исключением.

Например, Если человек делит что-то на 0, это выдаст исключение, поскольку компьютер не может обработать неопределенный объект.

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

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

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

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

Теперь, когда есть два типа исключений 1) Исключение времени выполнения, которое мы называем непроверенным исключением 2) Исключение времени компиляции, которое мы называем проверенным исключением

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

Я думаю, что следующий ответ поможет вам понять ....

  1. Есть ли лучшие примеры использования ключевого слова throw?

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

    public class Test {

    // here we have used "throws" in method signature 
    //   because we are throwing new Exception(), if array is null
    public static int getValue(int[] array, int index) throws Exception {

        // here we are preventing application from getting 
        // unconditional error (NullPointer exception)
        // if array is null, then we are throwing new Exception()
        if (array == null) {
            throw new Exception();
        }

        int value = array[index]; 
        return value;
    }

    public static void main(String[] args) {
        int[] array = null;
        // here we are wrapping our getValue() function call to try catch block
        // because getValue() function can throws Exception
        // so we are making it safe to execute our program
        try {
            int value = getValue(array, 0);
            System.out.println("value " + value);
        } catch (Exception e) {
            System.out.println("Provided array is null... so we caught the exception...");
        }
    }
}

если вы хотите узнать больше о том, как работает throw и throws ... тогда вам также нужно знать о Обработка исключений (отмечены и не отмечены).

  1. Почему в данном примере пользователь выбрал исключение вместо того, чтобы просто распечатать ошибку?

Согласно приведенному примеру, ваша функция предназначена для приветствия, но если какая-либо другая функция вызывает greet() с нулевое значение, то нет никаких причин для приветствия, как Hello, null, поэтому он генерирует исключение перед выполнением оператора. как...

    void greet(String name) {
        System.out.println("Hello, " + name);
    }

    String myName = null;
    greet(myName); // it will print "Hello, null";

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

try {
    checkDirectorySafe("/home/Donald");
    ... 
} catch (VirusException e) {
    ...
}

Уловка может быть в конце кода, а также улавливать исключения в других частях.

Есть еще одно преимущество. Функция может проверять все файлы в каталоге, и для всех подкаталогов нужно только рекурсивно вызывать себя с указанием пути к подкаталогу. В исключительных случаях стек вызовов разматывается до захвата.

Альтернативой может быть логический или необязательный результат и добавление кода if. Если функция также должна возвращать некоторые данные, это может стать немного уродливее.

Исключение - это как туалет в торговом центре.

Другие вопросы по теме