【发布时间】:2015-12-28 02:55:49
【问题描述】:
我在我的项目中对 json 文件进行了一些重大更改,现在 Gson 抱怨此错误:
java.lang.RuntimeException: Failed to invoke protected java.util.AbstractCollection() with no args
json源文件可以be found here.
我对对应对象的实现可以be found here
我正在像这样启动 Gson:
new Gson().fromJson(json.toString(), Config.class);
集成Gson的源文件可以be found here
我在 SO 上进行了一些搜索,然后找到了这篇文章,但链接已损坏,因此我无法真正解决问题。 https://stackoverflow.com/questions/17351720/deserializing-a-custom-object-with-gson-error-failed-to-invoke-public-custom-cla
我认为可能的唯一原因是Config.java:91中的这段代码
private AbstractCollection<String> expectedMessages = null;
public Structure() {
if(this.messagesInOrder) {
this.expectedMessages = new ArrayList<>();
} else {
this.expectedMessages = new HashSet<>();
}
}
但我不确定它为什么会导致错误,因为您可以正常执行此操作。也许 Gson 没有构造内部类的新实例?
这是堆栈跟踪以供参考
Exception in thread "main" java.lang.RuntimeException: Failed to invoke protected java.util.AbstractCollection() with no args
at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:107)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:78)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.Gson.fromJson(Gson.java:803)
at com.google.gson.Gson.fromJson(Gson.java:768)
at com.google.gson.Gson.fromJson(Gson.java:717)
at com.google.gson.Gson.fromJson(Gson.java:689)
at config.ParseConfig.convertJsonToObject(ParseConfig.java:70)
at config.ParseConfig.parseConfig(ParseConfig.java:36)
at JavaGrader.main(JavaGrader.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:104)
... 18 more
Process finished with exit code 1
【问题讨论】: