Gson错误:无法调用受保护的java.util.AbstractCollection()而没有args

时间:2015-12-28 02:55:50

标签: java json gson

我在项目中对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

1 个答案:

答案 0 :(得分:0)

好的,显然这很有效:

private Set<String> expectedMessages = new HashSet<>();
// remove CTOR

我想这是Gson没有构建类的新实例的问题?我想如果有人有一个很好的解释,那么我想知道!