|
|
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
1. Есть некий класс в некой библиотеке 2. Создаем новый класс-наследник класса из п.1 3. Переопределяем в нем один из методов, который имеет уже некий throws (например throws IOException) 4. Внутри этого метода, мы вызваем функции, которые могут выбрасывать например SQLException 5. Компилятор ругается, дескать, мы должны или отловить возможный SQLException в переопределенном методе, или добавить его в throws 6. Но добавить, просто дописав через запятую throws IOException, SQLException в override-методе не выходит (метод исходного класса-то не выбрасывает SQLException и добавить его в библиотеку не кажется правильным). Понимаю, что можно отловить SQLException и вывести сообщение об ошибке например в свойство(поле) класса. Но необходимо именно сгенерировать исключение SQLException. Есть варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2015, 23:08 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, автормы должны или отловить возможный SQLException в переопределенном методе ну так и сделайте так в try ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 00:25 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, вы же ещё можете имплементировать свой интерфейс. В интерфейсе задайте у нового метода спецификацию исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 00:29 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS1. Есть некий класс в некой библиотеке 2. Создаем новый класс-наследник класса из п.1 3. Переопределяем в нем один из методов, который имеет уже некий throws (например throws IOException) 4. Внутри этого метода, мы вызваем функции, которые могут выбрасывать например SQLException ... Есть варианты? Единственный вариант- прекратить заниматься фигнёй и прочитать хорошую книгу про ООП - рекомендую Мейера, "Объектно-ориентированное конструирование программных систем". Там очень подробно объясняется, что такое контракт. Так вот- в библиотеке есть контракт- метод может кинуть либо RuntimeException, либо IOException. И другого не дано. Наследники не могут менять контракт в сторону повышение требований (и новые exception это именно повышение требований). Это базовый принцип. Соответственно с точки зрения контракта базового класса случается IOException (проблема ж в вводе/выводе), а что очень хочется выкинуть SQLException - так что-то не правильно понимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 07:47 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Alexey TominНаследники не могут менять контракт в сторону повышение требований (и новые exception это именно повышение требований). Это базовый принцип. Об этом уже догадался, но хотел узнать, может есть нормальные способы обхода этого момента и как правильно решается такой вопрос. Книжки это хорошо, но они не дают ответы на все вопросы, которые могут возникнуть при переходе от теории к практике. За Мейера спасибо, посмотрю, главное, чтобы там было написано доступно с картинками для тупых ))), а не сухая теория в терминах сферического коневодства ). Neboну так и сделайте так в try Так и сделал изначально в catch пишу в поле класса сообщение об ошибке, а после вызова метода проверяю это поле класса на наличиt ошbбки, но по-моему это коряво само по себе и во-вторых, мне действительно надо в случае SQLException выбросить этот эксепшн, но блин как, если в override-методе его нет в throws :/ Можно было бы сгенерить экспешн после вызова метода и проверки поля, но штука в том, что метод этот вызывает в цикле внутри другого метода самой библиотеки, (то есть мне надо прервать выполнение "библиотечного" метода, который в цикле вызывает другой переопределенный метод библиотеки, в котором добавлено обращение к БД, т.е. может быть SQLExcpetion). Как решить через интерфейс (если решаемо) пока не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 11:27 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDSAlexey TominНаследники не могут менять контракт в сторону повышение требований (и новые exception это именно повышение требований). Это базовый принцип. Об этом уже догадался, но хотел узнать, может есть нормальные способы обхода этого момента и как правильно решается такой вопрос. Книжки это хорошо, но они не дают ответы на все вопросы, которые могут возникнуть при переходе от теории к практике. За Мейера спасибо, посмотрю, главное, чтобы там было написано доступно с картинками для тупых ))), а не сухая теория в терминах сферического коневодства ). Там только практика :) но мозг, думаю, тебе порёвт вклочья :D JDSNeboну так и сделайте так в try Так и сделал изначально в catch пишу в поле класса сообщение об ошибке, а после вызова метода проверяю это поле класса на наличиt ошbбки, но по-моему это коряво само по себе и во-вторых, мне действительно надо в случае SQLException выбросить этот эксепшн Тебу не нужен этот exception. Тебе нужно что-то другое. Вот когда сформулируешь то, что тебе нужно, а не плоды горьких размышлений, тогда и можно будет сказать, как это сделать. А пока подсказка: Код: sql 1. 2. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 11:35 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, непонятно, почему нельзя соблюдая контракт сделать рядом ещё один метод или применить вместо наследования композицию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 11:35 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Alexey TominА пока подсказка: +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 11:37 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDSПонимаю, что можно отловить SQLException и вывести сообщение об ошибке например в свойство(поле) класса. Но необходимо именно сгенерировать исключение SQLException. Есть варианты? можно вообще всё погасить и внутри писать только в лог. Снаружи не будет ничего. Поэтому, тут верно сказали, что ты так привязался к SQLException? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 11:40 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. Да так, вчера тоже была такая мысль и пробовал так, но вчера компилятор не пропускал, а сегодня прошло. Что не так делал вчера непонятно. Но спасибо, то, что нужно. Petro123можно вообще всё погасить и внутри писать только в лог. Снаружи не будет ничего. Поэтому, тут верно сказали, что ты так привязался к SQLException? Понятно, что можно в лог, можно хоть на почту отправлять, хоть смс Обаме или кому там писать ) Но нужно именно прервать выполнение, т.к. вызов идет в цикле изнутри опять же библиотечного метода, то удобнее всего по эксепшену. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:05 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDSНо нужно именно прервать выполнение хозяин барин. Выше сказали - подменить(наврать) в исключении, сделать свой метод с приставкой XXXX_ext() Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:30 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, Ещё для конструктора можете увеличить спецификацию исключений. Для метода нельзя, для конструктора можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:48 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, Плюс наследника исключения можете выбросить. Создайте наследника, заверните в него свой SQLException) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:50 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
NeboЕщё для конструктора можете увеличить спецификацию исключений. Для метода нельзя, для конструктора можно. Потому что конструкторы не наследуются и не переопределяются. Поэтому и "увеличить" технически нельзя. Это не "увеличение", а полностью новый конструктор со свои собственным набором исключений. Любым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:51 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
BlazkowiczNeboЕщё для конструктора можете увеличить спецификацию исключений. Для метода нельзя, для конструктора можно. Потому что конструкторы не наследуются и не переопределяются. Поэтому и "увеличить" технически нельзя. Это не "увеличение", а полностью новый конструктор со свои собственным набором исключений. Любым. Добавлю от Эккеля: Можно добавлять новые исключения для конструкторов, но нужно учитывать и исключения базового конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:56 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDS, авторКак решить через интерфейс (если решаемо) пока не понял. Просто реализуете ваш интерфейс с вашими методами (плюс спецификация SQLException) Попробуйте. Еще попробуйте с использованием внутреннего класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 12:59 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Nebo, imho оверхед это всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 13:15 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Нормального способа обрабатывать такие ситуации - не придумали. Но в поле класса - это вообще плохо. Класс будет не многопоточен и код обработке будет смешан с логикой. Стандартный способ - это обернуть "запрещенный" экзепшен в RuntimeException или своего наследника. Кстати, checked-экзепшены - это исключительно java-фича, на уровне jvm все исключения - unchecked. Этот факт делает вышеобозначеный способ обхода запрета - обидным и досадным. Особенно неудобно оборачивать в try-cacth в функциональных интерфейсах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 13:52 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Petro123Nebo, imho оверхед это всё Ну да) Ну хоть что-то) я думаю как бы я сделал. создал бы интерфейс с методом с нужной спецификацией исключения. Наследовался бы от библиотечного класса плюс имплементировал интерфейс. И всё. Исключение можно выбрасывать. Оверхед? Да. А что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 14:16 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Nebo, NeboНаследовался бы от библиотечного класса плюс имплементировал интерфейс. а имплементация не равна просто добавлению нового метода XXXXX_ext? Просто всё зависит от цели исключений. Вполне райзе "Нет файла" можно заменить на SQL райзе "Нет данных". Это уже БЛ пошла)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 14:35 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
Petro123, автора имплементация не равна просто добавлению нового метода XXXXX_ext? и так тоже можно сделать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 14:52 |
|
||
|
Добавление throws в переопределенном методе
|
|||
|---|---|---|---|
|
#18+
JDSкак правильно решается такой вопрос" Заворачиваем " одно исключение в другое. Since 1.4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2015, 17:24 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39135601&tid=2124525]: |
0ms |
get settings: |
6ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 459ms |

| 0 / 0 |
