Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключения и полиморфизм 
:(
    Опции темы
Romper
Дата 6.3.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 7.11.2012

Репутация: нет
Всего: 1



Код

import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays;
import java.util.Collections;

class TestExceptions {
    public static void main(String[] args) {
        //List<Integer> list = new ArrayList<Integer>();
        //List<Integer> list = Collections.unmodifiableList(Arrays.asList(0));
        
        addValue(list, 1);
        addValue(list, 2);
        addValue(list, 3);
        
        System.out.println(list);
    }
    
    public static void addValue(List<Integer> list, int value) {
        list.add(value);
    }
}



если раскомментировать 1 строку все нормально, если 2 то "Exception in thread "main" java.lang.UnsupportedOperationException"

история такая, изначально был только класс List, у него метод add не кидает исключения, и где-то метод addValue который не обрабатывает исключения, 
потом кто-то создал класс UnmodifiableList, отнаследовался от List, но у него метод add кидает исключения

как защититься от такого?
PM MAIL   Вверх
LSD
Дата 6.3.2013, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



List не класс, List интерфейс, и у него есть некие реализации. Для операций изменяющих содержимое явно указанно, что они могут выбрасывать UnsupportedOperationException. Поэтому или ты работаешь в неком "известном" окружении, про которое ты знаешь что тебе передают modifiable list, или ты не используешь эти операции, или делаешь свою копию List-а.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Romper
Дата 6.3.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 7.11.2012

Репутация: нет
Всего: 1



Цитата(LSD @  6.3.2013,  15:59 Найти цитируемый пост)
List не класс, List интерфейс, и у него есть некие реализации.

я пример хотел показать, могут быть совсем другие самописные классы
Цитата(LSD @  6.3.2013,  15:59 Найти цитируемый пост)
Для операций изменяющих содержимое явно указанно, что они могут выбрасывать UnsupportedOperationException.

это только у List или все "объекты"? 
если только у List мне вот интересно, они изначально об этом написали или когда добавили UnmodifiableList, если когда добавили то это как бы проблема, потому что до этого может быть написано очень много кода

вот эту проблему мне и интересно узнать как решать/предотвратить
PM MAIL   Вверх
LSD
Дата 6.3.2013, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Romper @  6.3.2013,  17:17 Найти цитируемый пост)
я пример хотел показать, могут быть совсем другие самописные классы

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


Цитата(Romper @  6.3.2013,  17:17 Найти цитируемый пост)
это только у List или все "объекты"?

Я говорил именно про List, но похожее поведение у всех Java коллекций.


Цитата(Romper @  6.3.2013,  17:17 Найти цитируемый пост)
если только у List мне вот интересно, они изначально об этом написали или когда добавили UnmodifiableList, если когда добавили то это как бы проблема, потому что до этого может быть написано очень много кода

UnsupportedOperationException существует с JDK 1.2. Не думаю что есть много кода написанного во времена до JDK 1.2.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Romper
Дата 6.3.2013, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 7.11.2012

Репутация: нет
Всего: 1



Цитата(LSD @  6.3.2013,  17:08 Найти цитируемый пост)
Если же есть поведение не описанное контарктом, то это или проблема контракта или реализации.

согласен  smile 

видимо пример с List не совсем удачный, я имел ввиду вот что, допустим есть такой код
Код

class Foo {
    // ...
    public void test() {
        System.out.println("Foo::test");
    }
    // ...
}

Код

class App {
    public static void main(String[] args) {
        Foo foo = new Foo();
        
        run(foo);
    }
    
    public static void run(Foo foo) {
        // ...
        foo.test();
        // ...
    }
}

со временем поивляется много кода с использованием Foo, метод test вызывается без обработки исключений, так как на момент написания он ничего не кидает
потом появляется класс Bar
Код

class Bar extends Foo {
    // ...
    public void test() {
        throw new UnsupportedOperationException();
    }
    // ...
}

а вместо некоторых объектов типа Foo появляются объекты типа Bar
Код

class App {
    public static void main(String[] args) {
        Foo foo = null;
        
        if (args.length == 2) {
            foo = new Bar();
        }  else {
            foo = new Foo();
        }
        
        run(foo);
    }
    
    public static void run(Foo foo) {
        // ...
        foo.test();
        // ...
    }
}

и понятно что теперь иногда вылетают исключения

Конечно это проблема реализации, но что надо сделать чтобы быстрее узнать о существовании такой проблемы?
PM MAIL   Вверх
LSD
Дата 7.3.2013, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Romper @  6.3.2013,  22:31 Найти цитируемый пост)
со временем поивляется много кода с использованием Foo, метод test вызывается без обработки исключений, так как на момент написания он ничего не кидает

Стоит заметить, что бывает 2 типа эксепшенов которые может выкидывать мето:
1. Ожидаемые эксепшены, которые задекларированны в контракте.
2. Эксепшены которые разработчиком не планировались и происходят или из-за внешних проблем или из-за ошибки в коде, это всякие OutOfMemoryError и NullPointerException.

Применительно к твоему примеру, надо понять где проблема: 
* метод пока не реализован (содержит ошибку), но будет реализован/пофиксан в будущем - тогда ничего не делаем, ждем фикса
* метод так и должен выкидывать эксепшн, значит это проблема контракта базового метода - нужно изменить контакт, например задекларировать в Foo.test() выбрасываемый эксепшн, причем желательно чтобы он был checked чтобы найти все места где он может возникнуть


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1295 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.