Java - класс Cast Exception с использованием Generics и Lists [duplicate]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
76
задан Mr. Polywhirl 15 July 2014 в 12:09
поделиться

2 ответа

Это хорошо известная проблема с стиранием типа Java: T - это просто переменная типа, и вы должны указать фактический класс, обычно как аргумент класса. Без такой информации лучшее, что можно сделать, это использовать границы; и простой T примерно такой же, как «T extends Object». Затем Джексон свяжет объекты JSON как Карты.

В этом случае метод тестера должен иметь доступ к классу, и вы можете построить

JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class)

, а затем

List<Foo> list = mapper.readValue(new File("input.json"), type);
139
ответ дан Jherico 17 August 2018 в 17:57
поделиться
  • 1
    Он работает: Я сделал следующее: JavaType topMost = mapper.getTypeFactory (). ConstructParametricType (MyWrapper.class, ActualClassRuntime.class); а затем сделал readValue, и он наконец-то сработал :) – techzen 28 July 2011 в 04:04
  • 2
    Да, это работает - спасибо за указание метода создания родового типа, кроме типа Map / Collection! – StaxMan 28 July 2011 в 16:47
  • 3
    То, что мне нужно, спасибо! – gresdiplitude 20 June 2012 в 07:50
  • 4
    @husayt да, технически java-classmate lib превосходит. Но интегрировать его с Jackson немного сложно, потому что абстракция собственного типа Jackson является частью API. В течение долгого времени было бы здорово найти правильный способ заставить Джексона использовать классный код, встроенный или через dep. – StaxMan 28 January 2014 в 01:06
  • 5
    Я чувствую, что Джексону не нужно скрывать то, что кажется разрывом в дженериках, но в любом случае это очень хорошо. – Adrian Baker 7 January 2018 в 05:36

«JavaType» работает! Я пытался отменить сортировку (deserialize) List в json String в ArrayList java Objects и изо всех сил пытался найти решение с тех пор. Ниже приведен код, который, наконец, дал мне решение. Код:

JsonMarshallerUnmarshaller<T> {
    T targetClass;

    public ArrayList<T> unmarshal(String jsonString) {
        ObjectMapper mapper = new ObjectMapper();

        AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
        mapper.getDeserializationConfig()
            .withAnnotationIntrospector(introspector);

        mapper.getSerializationConfig()
            .withAnnotationIntrospector(introspector);
        JavaType type = mapper.getTypeFactory().
            constructCollectionType(
                ArrayList.class, 
                targetclass.getClass());

        try {
            Class c1 = this.targetclass.getClass();
            Class c2 = this.targetclass1.getClass();
            ArrayList<T> temp = (ArrayList<T>) 
                mapper.readValue(jsonString,  type);
            return temp ;
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null ;
    }  
}
6
ответ дан Wrench 17 August 2018 в 17:57
поделиться
  • 1
    Как инициализировать TargetClass? – AZ_ 9 October 2013 в 04:23
  • 2
    Через конструктор или сеттер! – rushidesai1 10 October 2013 в 07:07
  • 3
    Пожалуйста, покажите мне небольшой пример. Я пропускаю Class & lt;? & Gt; target и затем получить target.getClassName (). – AZ_ 10 October 2013 в 09:08
  • 4
    Добавьте конструктор следующим образом: JsonMarshallerUnmarshaller & lt; T & gt; {private Class & lt; T & gt; targetClass; JsonMarshallerUnmarshaller (класс & lt; T & gt; c) {targetClass = c; }} Внесите соответствующие изменения в функцию «unmarshal», чтобы использовать этот класс, а не везде getClass. – rushidesai1 11 October 2013 в 20:02
  • 5
    Пара примечаний: код можно упростить, отметив, что все исключения - это подтипы IOException (требуется только один улов), а интроспектор аннотации по умолчанию уже JacksonAnnotationIntrospector - поэтому не нужно ничего делать с ObjectMapper, просто постройте его, и он работает. – StaxMan 4 November 2015 в 18:34
Другие вопросы по тегам:

Похожие вопросы: