1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
1

Исключения и полиморфизм (непонятна задача)

08.05.2017, 11:57. Показов 1715. Ответов 10
Метки нет (Все метки)

Всем привет, приступлю сразу к делу, в книге Сьерра К и Бейтс Б. на странице 364 есть задание смысл которого мне не совсем ясен, т.е. что надо сделать и как?
Вот картинка страницы http://imgdepo.com/id/10619915.jpg
Что тут надо сделать и как это сделать скажите мне плиз.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2017, 11:57
Ответы с готовыми решениями:

Непонятна задача по сетям
Выбрать подходящий класс IP-адресов с правильной маской подсети таким образом,чтобы обеспечить IP...

Массив. Непонятна задача
Задание звучит так. ВВести с клавиатуры целое число K(от 6 до 15). Ввести с клавиатуры массив из K...

Тема. Полиморфизм. Задача
В программе выполнены следующие описания: class A { protected: int a; public: A(int ax)...

Задача на принцип наследования и полиморфизм
Используя стандартную библиотеку шаблонов STL и класс list по работе с двунаправленным списком,...

10
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
08.05.2017, 12:45 2
Лучший ответ Сообщение было отмечено Maxim09 как решение

Решение

Он пишет о том, что если классы исключений создаваемые пользователем наследуют друг друга, и чтобы их все словить,
надо расположить блоки catch так, чтобы самый дальний потомок (BoinkEx) был на самом верху блоков catch,
а корневой предок(BazEx) был в самом низу. Иначе произойдет поглощение и предок не пропустить исключение потомка.
Вот код который отрабатывает исключения. Показан только один вариант, второй думаю сможете сами придумать.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class TaskEx {
    private static class BazEx extends Exception {
    }
    private static class FooEx extends BazEx {
    }
    private static class BiffEx extends FooEx {
    }
    private static class BarEx extends FooEx {
    }
    private static class BoinkEx extends BiffEx {
    }
    private static class GenX {
        public void doRisky(int i) throws BazEx {
            switch (i) {
                case 0:
                    throw new BoinkEx();
                case 1:
                    throw new BiffEx();
                case 2:
                    throw new BarEx();
                case 3:
                    throw new FooEx();
                case 4:
                    throw new BazEx();
            }
 
        }
    }
 
    public static void main(String[] args) {
        GenX x = new GenX();
        for (int i = 0; i < 5; i++) {
            try {
                x.doRisky(i);
            } catch (BoinkEx b) {
                System.out.println(b.getClass().getSimpleName());
            } catch (BarEx b) {
                System.out.println(b.getClass().getSimpleName());
            } catch (BiffEx b) {
                System.out.println(b.getClass().getSimpleName());
            } catch (FooEx b) {
                System.out.println(b.getClass().getSimpleName());
            } catch (BazEx b) {
                System.out.println(b.getClass().getSimpleName());
            }
 
        }
    }
}
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
08.05.2017, 13:13  [ТС] 3
v777779,
Честно говоря не совсем понял написанный выше код! Зачем там нужен switch, почему имеет место быть следующее?
Java
1
2
3
4
5
6
7
8
9
10
11
public class TaskEx {
    private static class BazEx extends Exception {
    }
    private static class FooEx extends BazEx {
    }
    private static class BiffEx extends FooEx {
    }
    private static class BarEx extends FooEx {
    }
    private static class BoinkEx extends BiffEx {
    }
Почему там вложенные классы ? Не пойму объясните.
Т.е. зачем надо объявлять наследование классов в другом классе?
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
08.05.2017, 13:16 4
Все только для демонстрации, switch сделан чтобы перебрать все варианты исключений, только для демонстрации.
В реальном коде исключения выдают какие то методы в каких то ситуациях.
Вложенные классы тоже только чтобы все было в одном файле и запостить сюда одним текстом, а не выкладывать zip архив или несколько блоков кода.
В реальном проекте располагайте их в отдельных файлах как обычные классы.
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
08.05.2017, 13:24  [ТС] 5
Скажите а вообще проверка исключений в catch блоках происходит с верху вниз да? Если имеет место быть полиморфизм.
Т.е. JVM проверяет catch блоки с верху вниз и если сверху будет класс <-- так скажем| родитель, то все его подклассы уже не будут проверяться.
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
08.05.2017, 13:31 6
Да, именно так и будет, я об этом и написал выше.
1
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
08.05.2017, 18:43  [ТС] 7
Просто зачастую в книге так Закавыристо напишут что смысл того или иного сложновато бывает понять, хотя книга не сложная яб даже сказал почти лёгкая.

Добавлено через 5 часов 2 минуты
А что будет если JVM начнёт проверку с главного родительского класса(предок), ведь по идее "Р"класс содержит класс потомок и выбрасываемое исключение должно сработать так? Ведь он -> класс потомок, есть в наследственной иерархии с предком? Иначе что произойдёт в этом случае?
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
08.05.2017, 19:10 8
JVM начнет проверку с верхнего catch и пойдет вниз по коду. Программист решает какой класс поставить в catch выше, а какой ниже.
Если программист поставит catch базового класса выше потомка, ну значит это ошибка программиста, что у него есть участок кода который никогда не сработает.
0
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
08.05.2017, 19:17  [ТС] 9
Исключение потомка сработает если вверх поставить класс предок?
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
08.05.2017, 20:18 10
Цитата Сообщение от v777779 Посмотреть сообщение
...надо расположить блоки catch так, чтобы самый дальний потомок (BoinkEx) был на самом верху блоков catch,
а корневой предок(BazEx) был в самом низу.
Иначе произойдет поглощение и предок не пропустит исключение потомка.
Цитата Сообщение от Maxim09 Посмотреть сообщение
Скажите а вообще проверка исключений в catch блоках происходит с верху вниз да? Если имеет место быть полиморфизм.
Т.е. JVM проверяет catch блоки с верху вниз и если сверху будет класс <-- так скажем| родитель, то все его подклассы уже не будут проверяться.
Цитата Сообщение от v777779 Посмотреть сообщение
Да, именно так и будет, я об этом и написал выше.
Цитата Сообщение от Maxim09 Посмотреть сообщение
сключение потомка сработает если вверх поставить класс предок?
Нет.

Вопросы повторяются по кругу одни и те же, как и ответы.
Предлагаю пройти по шагам и посмотреть в симуляторе.
0
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
08.05.2017, 20:40  [ТС] 11
Цитата Сообщение от v777779 Посмотреть сообщение
Иначе произойдет поглощение и предок не пропустит исключение потомка.
Иными словами если указать вверх предок то он предок не увидит методы. поля и функции самого класса наследника а увидит только то что унаследовал класс потомок от класса предка так? Я всё верно понял?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2017, 20:40
Помогаю со студенческими работами здесь

Наследование и полиморфизм. Задача с классом Ellipsoid
Добрый день) Подскажите, поджалуйста, что по заданию корректно изменить в задаче нужно: На...

Задача из Страуструпа про исключения
Пожалуйста, помогите с задачкой из книги Страуструпа: 14.12.9. (*1) Имеется int main() { /*...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class...

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

Непонятна программа
If '%1'==''(echo noy) else (if '%2'==''(copy %1\*.*)) else (if '%3'==''(copy %1\*.* %2)) else...

Непонятна документация stm32f103c8t6
Здравствуйте. Осваиваю мир мк stm32f103c8t6. Не могу разобрать документацию. Хочу настроить пины 0...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru