由于我已经向Schedule类添加了一个整数,因此Gson在某些设备上抛出了一个错误:java.lang.IllegalStateException: Expected an int but was BEGIN_ARRAY at line 1 column Y
(例如,列112或120等)。我查看了this和this的答案,这似乎表明Gson期望的是一个int,但得到的是一个开始_ARRAY字符,但我 * 不 * 知道为什么在向类中添加额外的int的重构后会发生这种情况。
在此之前,我从存储的Json字符串解析Schedule对象列表的代码工作得非常好。我添加了Since annotation,因为抛出了异常。下面是Schedule类:
public class Schedule {
/**
* Added this variable
*/
@Since(1.1) private int addedVar;
/**
* All other variables have the @Since(1.0) annotation
*/
@Since(1.0) all other vars;
}
用于分析计划的函数:
public static ArrayList<Schedule> schedulesFromJson(String schedulesJson) {
Type listType = new TypeToken<ArrayList<Schedule>>(){}.getType();
Gson gson = new Gson();
try {
return gson.fromJson(schedulesJson, listType);
} catch (Exception exception) {
// Try to use the previous version of the schedule, because of IllegalStateException
gson = new GsonBuilder().setVersion(1.0).create();
return gson.fromJson(schedulesJson, listType);
}
}
奇怪的是:在一些设备上(比如我自己的测试设备),这个崩溃从来没有发生过。2因为这个崩溃,我添加了带有try和catch子句的Since注解,因为我预计它可能与添加的额外整数有关,并且可以通过简单地阅读旧的Schedule版本来防止它,但是这仍然在catch子句中抛出了相同的异常。
有什么能解释的吗?
1条答案
按热度按时间jutyujz01#
想通了:因为没有将Profuard设置为 not 对Schedule对象进行模糊处理(感谢@Marcono1234给我提供了正确的指导),所以Schedule对象作为一个模糊对象(
{"a":true,"b":"Name","c":[true,true,true,true,true,false,false], etc}
)存储在存储中,而不是使用变量名。根据添加
addedVar
之前的Schedule类结构,调度中存在数组,因此引发了异常。示例更简单。旧的调度类:
新的计划类:
因为在
ArrayList<String> list
之前添加了int变量,所以当Gson尝试反序列化存储的JSON字符串时,它预期看到的是int(addedVar
,但实际上从列表中看到的是开始_ARRAY。我通过在Schedule类中的列表之后放置'addedVar'来修复它,这样Since(1.0)注解就可以正常工作了。