Учитель zapp

Десериализация

  • 11
  • Недоступна
На вход подается поток, в который записан сериализованный объект класса A либо класса B. Десериализуйте объект в методе getOriginalObject так, чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null. Реализуйте интерфейс Serializable там, где необходимо.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (66)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Павел Минеев31 уровень, Челябинск
2 сентября, 15:10
Сдал с первого раза, условие показалось мутным - ждал подвоха, но не дождался. instanceof здесь не нужен т.к.
try {
    A a = (A) objectStream.readObject();
    return a;
если передали объект типа A или B, кастинг сработает штатно, а если нет - вылетит эксепшен, который по условию задачи нам и нужно ловить и обрабатывать.
} catch (Exception e) {
    System.out.println("Ахтунг! Ошибка!");
    return null;
}
Ihor Biedin22 уровень, Днепр
четверг, 00:10
Почему то я первый раз решил ловить ClassNotFoundException
Wladyslaw22 уровень, Warsaw
26 августа, 13:08
Решил то с первой попытки, но условие построено, конечно, так что понять что хотят - трудно. Десериализовал - проверил получился ли инстанс оф B. Нет? Ну так вернем null тогда. В случае исключения - вообще любого - тоже вернул null "Вывести сообщение" - ну стектрейс в консоль вывел - прошло. Хотя опять же, везде пишут что логика программы реализованная через исключения - это вообще очень плохое решение. Ну да ладно, учебная задача
Владислав Пахомов33 уровень, Белгород
5 июля, 07:06
Вы решили задачу лучше, чем 75% учеников. Вам удалось ее решить с 1 попытки. Среднее количество попыток для этой задачи 3.8. Всего эту задачу решили 9106 учеников. Уряяя
Dmitry Potamoshnev30 уровень, Москва
30 июня, 18:53
Условие конечно тяжелое. Но в целом - просто бегло пробежавшись по комментам тут сразу стало понятно, что делать чтобы избежать проблем с валидатором.
MrKermit22 уровень, Москва
7 мая, 11:34
Вы решили задачу лучше, чем 8% учеников. Вам удалось ее решить с 8 попытки. Дно пробито) Исключение Exception, не надо вписывать специфичные.
Eugene23 уровень
13 апреля, 20:21
Создал поток для чтения из файла и убил семь попыток...:(
Николай30 уровень
24 марта, 11:39
В описании задачи: "... чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null." Там же, но в разделе требования: " ... должен возвращать null, если при попытке десериализации возникло исключение." Т.е. не требуется писать никаких сообщений, просто вернуть null
Радик33 уровень, Казань
18 февраля, 20:56
Делов-то, с 9 попытки
S3R3N1TY37 уровень, Санкт-Петербург
18 февраля, 18:14
Для теста привел классы к статическим и создал класс "C". Затем пытался десериализовать обьект класса С в методе getOriginalObject , что привело к исключению вида: java.lang.ClassCastException: Solution$C cannot be cast to Solution$A Добавил данное исключение и обработал, к тем catch, которые уже были при создании блока try. Но валидатор при проверке написал, что нужно перехватить Исключение- видимо общего типа. Итого: достаточно обработать один общий Exception.
Алексей Масис35 уровень, Новосибирск
20 февраля, 09:12
а зачем создавать класс которого нет в коде? Да и по условию задачи вроде как сказано На вход подается поток, в который записан сериализованный объект класса A либо класса B.
S3R3N1TY37 уровень, Санкт-Петербург
20 февраля, 09:32
Чтобы проверить работу программы: по условию Метод getOriginalObject должен возвращать null, если при попытке десериализации не был получен объект типа A. Я просто для себя сделал такой тест, чтобы проверить работу исключения. А ты как проверял, что написал в мейне, чтобы убедиться что выдает исключение ?
Алексей Масис35 уровень, Новосибирск
20 февраля, 09:37
так там наверное имелось ввиду, возвращать null если был получен объект типа B. А вообще с каждым лв условия все труднее понять)
Алексей Масис35 уровень, Новосибирск
20 февраля, 12:08
нуу правильно, но ведь чтобы вернуть null не обязательно ловить исключение)
S3R3N1TY37 уровень, Санкт-Петербург
20 февраля, 13:26
По заданию сказано так: "чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null." А ты через что делал- скинь код в личку. Спасибо.
Александр23 уровень, Казань
4 апреля, 07:54
Сначала не понял в чем дело: почему успешно кастится object и к A и к B - потом вспомнил про наследование. В итоге я получал класс объекта
String className = object.getClass().getSimpleName();
И если он не В - кидаю исключение
if (className.equals("B")) throw new Exception();
Хотя вот ниже покрасивей делали:
(!object.getClass().equals(A.class)
Dmitry Potamoshnev30 уровень, Москва
30 июня, 18:50
есть же instanceof:
//...
Object o = objectStream.readObject();
if (o instanceof A)
    //...
Ivan30 уровень, Нижний Новгород
26 июля, 13:25
так B наследник A, поэтому
b instanceof A
будет true, что нам не нужно
Luk_d26 уровень
26 августа, 04:15
А где написано, что не может быть B? Нормально все проходит через instanceof. В условии же написано, что поток с А или В.
Ivan30 уровень, Нижний Новгород
26 августа, 06:54
в требованиях строчка: "Метод getOriginalObject должен возвращать объект типа A полученный из потока ObjectInputStream."
Luk_d26 уровень
26 августа, 08:04
A a = new B();
Ivan30 уровень, Нижний Новгород
26 августа, 09:23
кто спорит) Но там вроде бы именно класс А должен был быть, а не наследники, то есть getName().getSimleName должен был возвращать именно А. Я конечно точно не помню, но по другому свой июльский коммент объяснить не могу.
Luk_d26 уровень
26 августа, 15:04
не знаю, может поменяли условия валидации, но сегодня через instanceof валидацию прошло
Даниил36 уровень
6 февраля, 12:16
Чем лучше пытаешься решить задачу, чем ближе к "непонятному описанию", тем больше времени и попыток тратишь. Решил бы с первого раза, так нет же, валидатору нужно более тупое решение где просто ловим одно верхнее исключение вместо нескольких более конкретных. Это я к тому что ловить нужно только Exception. А вывод сообщения, в данном случае, это походу просто printStackTrace. И того с 3 попытки только.
Юрий23 уровень, Москва
12 февраля, 11:37
Тоже самое.. решение правильное, но валидатор не принимает, ему нужно попроще