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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Продолжение работы программы после ошибки, как реализовать 
:(
    Опции темы
koreyko
Дата 11.10.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! Программа получает список объектов с сервера. Возможны ситуации, когда какой-либо объект на сервере некорректен (обязательные поля пустые), при этом вываливается исключение java.lang.NullPointerException и получение данных прекращается. Необходимо продолжить загрузку следующих корректных объектов, несмотря на ошибку. 

Сам класс, реализующий получение данных, входит в библиотеку, которую редактировать нежелательно. Возможно ли как-то решить проблему "снаружи", не трогая библиотеку? Другими словами, заставить JVM игнорировать конкретные исключения в конкретном месте программы? 


PM MAIL   Вверх
Ares4322
Дата 15.10.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

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



А как происходит прием данных?
PM MAIL   Вверх
math64
Дата 15.10.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если загрузка происходит примерно так:
Код

public class Loader {
   public Object[] getObjects(String[] names) {
      Object[] objects = new Objects[names.length];
      for (int i = 0; i < names.length; i++) {
        objects[i] = getObject(names[i]);
      }
   }
   public Object getObject(String name) { ... }
   public static void main(Sting[] args) {
     Loader loader = new Loader();
     loader.getObjects(args);
   }
};

то можно исправить так:
Код

public class Loader2 extends Loader {
   // Переопределить один из методов
   Object[] getObjects(String[] names) {
      Object[] objects = new Objects[names.length];
      for (int i = 0; i < names.length; i++) {
        try {
          objects[i] = getObject(names[i]);
        } catch (NullPointerException e) {
          objects[i] = new Object();
        }
      }
   }
   public Object getObject(String name) {
     try {
       return super.getObject(names[i]);
     } catch (NullPointerException e) {
       return new Object();
     }
   }
   public static void main(Sting[] args) {
     Loader2 loader = new Loader2();
     loader.getObjects(args);
   }
};


PM   Вверх
koreyko
Дата 24.10.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Ares4322 @ 15.10.2011,  19:29)
А как происходит прием данных?

Используется библиотечная функция, которой на вход подается тип объекта. На выходе - список объектов данного типа. Если в ответ на получение какого-либо объекта из списка функция получает ошибочный ответ сервера, то генерируется исключение, т.е. я ничего не получаю. А мне необходимо, чтобы некорректные объекты игнорировались и я получил бы список корректных объектов, несмотря на исключение. 

Возможно ли это сделать без вмешательства в  библиотечную функцию?
Спасибо.

Добавлено @ 17:24
Цитата(math64 @ 15.10.2011,  20:36)
Если загрузка происходит примерно так:

то можно исправить так:

   public Object getObject(String name) {
     try {
       return super.getObject(names[i]);
     } catch (NullPointerException e) {
       return new Object();
     }
   }
  
[/code]

Спасибо. Но возможны ли решения проблемы без вмешательства в функцию GetObject(), так сказать, "снаружи"?

Это сообщение отредактировал(а) koreyko - 24.10.2011, 17:26
PM MAIL   Вверх
math64
Дата 24.10.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Чисто снаружи не получится - нужно заменить какой-то класс на производный, в методе которого можно перехватить исключение, какой - зависит от архитектуры библиотеки.
При этом ловить исключение нужно до того, как оно пройдёт функцию, хранящую список уже загруженных объектов, иначе он будет потерян. Иначе нужно переписывать библиотеку - добавить туда перехват исключения, причём для большей гибкости добавить интерфейс типа такого, возможно в библиотеке уже что-то подобное предусмотрено:
Код

   public interface IObjectReplacer {
      Object getObject(String name);
   }
   IObjectReplacer objectReplacer;

   public void setObjectReplacer(IObjectReplacer objectReplacer) {
     this.objectReplacer = objectReplacer;
   }

   public Object getObject(String name) {
     try {
       return super.getObject(names[i]);
     } catch (NullPointerException e) {
       if (objectReplacer != null)
         return objectReplacer.getObject(name);
       return new Object();
     }
   }

PM   Вверх
koreyko
Дата 25.10.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(math64 @ 24.10.2011,  21:39)
Чисто снаружи не получится - нужно заменить какой-то класс на производный, в методе которого можно перехватить исключение, какой - зависит от архитектуры библиотеки.
При этом ловить исключение нужно до того, как оно пройдёт функцию, хранящую список уже загруженных объектов, иначе он будет потерян. Иначе нужно переписывать библиотеку - добавить туда перехват исключения, причём для большей гибкости добавить интерфейс типа такого, возможно в библиотеке уже что-то подобное предусмотрено:
Код

   public interface IObjectReplacer {
      Object getObject(String name);
   }
   IObjectReplacer objectReplacer;

   public void setObjectReplacer(IObjectReplacer objectReplacer) {
     this.objectReplacer = objectReplacer;
   }

   public Object getObject(String name) {
     try {
       return super.getObject(names[i]);
     } catch (NullPointerException e) {
       if (objectReplacer != null)
         return objectReplacer.getObject(name);
       return new Object();
     }
   }

Спасибо вам за сэкономленное время. Теперь не буду отвлекаться на нереальные решения. 
PM MAIL   Вверх
ИванИванович
Дата 26.10.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Чисто снаружи не получится


Вообще это можно сделать "чисто снаружи", если использовать java.lang.instrument API,  и написать  javaagent с имплементацией ClassFileTransformer.  Там можно использовать ASM или нечто подобное, чтобы завернуть "getObject" метод в try/catch манипулируя bytecode.

нечто подобное описано тут 
если вдруг будет скушно и будет время  - напишу 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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