Gson, enum и попытка вызвать виртуальный метод java.lang.Class java.lang.Object.getClass () для ссылки на нулевой объект

Есть json, содержащий значение параметра String, например. status и этот json отображаются Gson в POJO, и этот параметр отображается в настраиваемом перечислении. JSON:

{"status":"on"}

POJO

public class StatusData {
    @SerializedName("status")
    @Expose
    private Status status;
}

перечисление:

public enum Status {
   @SerializedName("on")ON,
   @SerializedName("off")OFF;
}

И если json содержит правильные значения ("включено" или "выключено") - все в порядке, но если есть неподдерживаемое значение, например "неизвестно" - то глючит с Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference. И вопрос: есть ли способ изменить сообщение об исключении, чтобы понять, что пошло не так?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
606
2

Ответы 2

Нет необходимости создавать новый класс enum

Используйте http://www.jsonschema2pojo.org/ для создания класса pojo

Попробуй это

public class StatusData
{
    @SerializedName("status")
    @Expose
    private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

Затем я хочу работать с enum, но без String, я знаю, что могу изменить геттеры и сеттеры и сопоставить String и Enum там, но я просто хочу исключить исключение с понятным описанием

TheSecond 05.04.2018 10:35
public class StatusData {
@SerializedName("status")
@Expose
private Status status;

public String getStatus() {
    return status;
}
}

Сохраните ваш response как объект StatusData

StatusData statusData=response;
String status=statusData.getStatus();
if (status.equals("on")){
  //code when status is "on"
} else if (status.equals("off")){
  //code when status is "off"
}

или используйте gson

Gson gson = new Gson();
StatusData statusData = gson.fromJson("json response",
                                        StatusData.class);

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

TheSecond 05.04.2018 11:58

Другие вопросы по теме