【问题标题】:Gson error: Failed to invoke protected java.util.AbstractCollection() with no argsGson 错误:无法在没有参数的情况下调用受保护的 java.util.AbstractCollection()
【发布时间】: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

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    好的,显然这可行:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2022-01-21
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多