Подскажите, не могу понять, почему программа должна выводить ответы в обратном порядке.
По логике, как только ввели ок, мне печатает текст, потом переводит в блок catch, где выводится на печать текущий answer "ок", и снова вызывается исключение,то есть программа закрывается. Что не так в моей логике?
package com.javarush.task.pro.task14.task1406;
import java.util.Scanner;
/*
Купи слона
*/
class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
buyElephant(null, scanner);
}
static void buyElephant(String answer, Scanner scanner) {
if (answer == null) {
System.out.println("Купи слона");
} else if (answer.toLowerCase().equals("ок")) {
System.out.println("Так-то лучше :) Список твоих отговорок:");
throw new SecurityException();
} else {
System.out.println("Все говорят \"" + answer + "\", а ты купи слона");
}
answer = scanner.nextLine();
try {
buyElephant(answer, scanner);
} catch (Exception e) {
//напишите тут ваш код
System.out.println(answer);
throw e;
}
}
}
Andrey
51 уровень
Что делает throw в блоке catch
Решен
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей
24 мая 2021, 22:38решение
Тут происходит рекурсивный вызов функции в блоке try. Логика такая, что код запускает сам себя несколько раз. Скажем, ты написал первую отговорку, в try функция вызвала себя еще раз, написал вторую отговорку, функция вызвала в try себя еще раз, написал третью отговорку, функция вызвала в try себя же в третий раз. Далее ты пишешь Ок, функция выбрасывает исключение и завершается, но т.к. она завершается и возвращается в try, где вызвала себя третий раз, то исключение перехватывается, печатается ответ и снова исключение. По исключению функция возвращается в try от второго вызова, перехватывает исключение, печатает ответ и снова бросает исключение. И т.д. пока не раскрутит назад всю цепочку рекурсивных вызовов.
Тут получается как матрешка из вызовов фукции/метода. Например более простой вариант:
Этот код в итоге развернется в нечто такое по порядку вызовов (стек вызовов):
1. 3 + sum(2)
2. 2 + sum(1)
3. 1 + sum(0)
4. return 0
5. 1+0
6. 2 + 1 + 0
7. 3 + 2 + 1 +0
8. y = 3 + 2 + 1 + 0 = 6
В твоем коде происходит нечто похожее, только выход из функции осуществляется путем выброса и перехвата исключений, а не return-ами.
Почитай про рекурсию и стек вызовов функций. +11
Andrey
25 мая 2021, 00:07
Спасибо, очень помог! Самым сложным было понять, что функция возвращается в try второго вызова. Получается когда первый раз срабатывает throw e - это try предпоследний и т.д. Вложенный try как бы.
0