'没有类的参数构造函数不存在',但它确实存在 [英] 'No args constructor for class does not exist', but it does

查看:129
本文介绍了'没有类的参数构造函数不存在',但它确实存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到错误类MwVolleyApi $ Page的No-args构造函数不存在。用Gson注册一个InstanceCreator来解决这个问题。我已经阅读了这篇文章,发现了两种类型的解决方案,这两种解决方案似乎都不适合我:


  1. https://github.com/google/gson/issues/135 - 使用静态嵌套类(我做过)

  2. 类XXX的无参数构造函数不存在 - 为该类创建无参数构造函数(我做过)



完整的错误信息: 08 17:07:53.790:E / Volley(31902):[4551] NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:类fr.free.nrw.commons.upload.MwVolleyApi的无参数构造函数$ Page not存在。用Gson注册一个InstanceCreator来解决这个问题。
10-08 17:07:53.790:E / Volley(31902):java.lang.RuntimeException:类fr.free.nrw.commons.upload.MwVolleyApi $ Page的No-args构造函数不存在。用Gson注册一个InstanceCreator来解决这个问题。
10-08 17:07:53.790:E / Volley(31902):at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:64)
10-08 17:07:53.790: E / Volley(31902):com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53)
10-08 17:07:53.790:E / Volley(31902):at com.google.gson .JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:41)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56)
10-08 17:07:53.790:E / Volley(31902):在com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisitor.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisitor .visitChildAsObject(JsonDeserializationVisitor.java:95)
10-08 17:07:53.790:E / V olley(31902):com.google.gson.JsonArrayDeserializationVisitor.visitArray(JsonArrayDeserializationVisitor.java:73)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.ObjectNavigator .accept(ObjectNavigator.java:109)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisitor.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790:E / Volley(31902):at com.google.gson.JsonDeserializationVisitor.visitChildAsArray(JsonDeserializationVisitor.java:102)
10-08 17:07:53.790:E / Volley 31902):at com.google.gson.JsonObjectDeserializationVisitor.visitArrayField(JsonObjectDeserializationVisitor.java:81)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.ObjectNavigator.navigateClassFields (ObjectNavigator.java:154)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:123)
10- 08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisit or.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.JsonDeserializationVisitor.visitChildAsObject(JsonDeserializationVisitor.java:95)
10-08 17:07:53.790:E / Volley(31902):在com.google.gson.JsonObjectDeserializationVisitor.visitObjectField(JsonObjectDeserializationVisitor.java:62)
10-08 17:07:53.790:E / Volley (31902):com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java:156)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.ObjectNavigator。 accept(ObjectNavigator.java:123)
10-08 17:07:53.790:E / Volley(31902):at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)
10 -08 17:07:53.790:E / Volley(31902):at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)
10-08 17:07:53.790:E / Volley(31902) ):com.google.gson.Gson.fromJson(Gson.java:495)
1 0-8 17:07:53.790:E / Volley(31902):在com.google.gson.Gson.fromJson(Gson.java:444)
10-08 17:07:53.790:E / Volley 31902):com.google.gson.Gson.fromJson(Gson.java:396)
10-08 17:07:53.790:E / Volley(31902):com.google.gson.Gson.fromJson (Gson.java:372)
10-08 17:07:53.790:E / Volley(31902):at fr.free.nrw.commons.upload.MwVolleyApi $ QueryRequest.parseNetworkResponse(MwVolleyApi.java:140)
10-08 17:07:53.790:E / Volley(31902):at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:123)
10-08 17:07:53.790: E / fr.free.nrw.commons.upload.MwVolleyApi $ LogResponseErrorListener(31902):com.android.volley.VolleyError:java.lang.RuntimeException:类fr.free.nrw.commons.upload.MwVolleyApi的无参数构造函数$ Page不存在。用Gson注册一个InstanceCreator来解决这个问题。

相关代码:

  private static class QueryRequest extends JsonRequest< QueryResponse> {
private static final String TAG = QueryRequest.class.getName();

public QueryRequest(String url,
Response.Listener< QueryResponse> listener,
Response.ErrorListener errorListener){
super(Request.Method.GET,url, null,listener,errorListener);
}

@Override
受保护的响应< QueryResponse> parseNetworkResponse(NetworkResponse响应){
String json = parseString(response);
QueryResponse queryResponse = GSON.fromJson(json,QueryResponse.class);
return Response.success(queryResponse,cacheEntry(response));
}

private Cache.Entry cacheEntry(NetworkResponse response){
return HttpHeaderParser.parseCacheHeaders(response);
}

private String parseString(NetworkResponse response){
try {
return new String(response.data,HttpHeaderParser.parseCharset(response.headers));
} catch(UnsupportedEncodingException e){
return new String(response.data);




$ b private static class QueryResponse {
private Query query = new Query();

private String printSet(){
if(categorySet == null || categorySet.isEmpty()){
GpsCatExists.setGpsCatExists(false);
Log.d(TAG,gpsCatExists =+ GpsCatExists.getGpsCatExists());
返回不收集类别;
} else {
GpsCatExists.setGpsCatExists(true);
Log.d(TAG,gpsCatExists =+ GpsCatExists.getGpsCatExists());
返回CATEGORIES FOUND+ categorySet.toString();



$ b @Override
public String toString(){
if(query!= null){
returnquery =+ query.toString()+\\\
+ printSet();
} else {
returnNo pages found;
}
}
}

私人静态类查询{
私人页面[]页面;

@Override
public String toString(){
StringBuilder builder = new StringBuilder(pages =+\\\
);
if(pages!= null){
for(Page page:pages){
builder.append(page.toString());
builder.append(\\\
);
}
builder.replace(builder.length() - 1,builder.length(),);
return builder.toString();
} else {
returnNo pages found;
}
}
}

私有静态类页面{
private int pageid;
private int ns;
私有字符串标题;
私人类别[]类别;
私人类别类别;

public Page(){
}
$ b $ @覆盖
public String toString(){

StringBuilder builder = new StringBuilder(PAGEID =+ pageid +ns =+ ns +title =+ title +\\\
+CATEGORIES =);

if(categories == null || categories.length == 0){
builder.append(no categories exist \\\
);
} else {
for(Category category:categories){
builder.append(category.toString());
builder.append(\\\
);
if(category!= null){
String categoryString = category.toString()。replace(Category:,);
categorySet.add(categoryString);
}
}
}

categoryList = new ArrayList< String>(categorySet);
builder.replace(builder.length() - 1,builder.length(),);
return builder.toString();
}
}

private static class Category {
private String title;

@Override
public String toString(){
return title;
}
}


解决方案

不能实例化私有嵌套类。让你的 Page class public:

  public static class Page { 。} 


I am receiving the error No-args constructor for class MwVolleyApi$Page does not exist. Register an InstanceCreator with Gson for this type to fix this problem. I've read up on this and have found two types of solutions, neither of which seems to work for me:

  1. https://github.com/google/gson/issues/135 - use a static nested class (I did)
  2. No-args constructor for class XXX does not exist - create a no args constructor for the class (I did)

What am I missing?

Full error message:

10-08 17:07:53.790: E/Volley(31902): [4551] NetworkDispatcher.run: Unhandled exception java.lang.RuntimeException: No-args constructor for class fr.free.nrw.commons.upload.MwVolleyApi$Page does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
10-08 17:07:53.790: E/Volley(31902): java.lang.RuntimeException: No-args constructor for class fr.free.nrw.commons.upload.MwVolleyApi$Page does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.MappedObjectConstructor.constructWithNoArgConstructor(MappedObjectConstructor.java:64)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.MappedObjectConstructor.construct(MappedObjectConstructor.java:53)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonObjectDeserializationVisitor.constructTarget(JsonObjectDeserializationVisitor.java:41)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.getTarget(JsonDeserializationVisitor.java:56)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChildAsObject(JsonDeserializationVisitor.java:95)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonArrayDeserializationVisitor.visitArray(JsonArrayDeserializationVisitor.java:73)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:109)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChildAsArray(JsonDeserializationVisitor.java:102)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonObjectDeserializationVisitor.visitArrayField(JsonObjectDeserializationVisitor.java:81)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java:154)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:123)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChild(JsonDeserializationVisitor.java:107)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationVisitor.visitChildAsObject(JsonDeserializationVisitor.java:95)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonObjectDeserializationVisitor.visitObjectField(JsonObjectDeserializationVisitor.java:62)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java:156)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:123)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:73)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:51)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.Gson.fromJson(Gson.java:495)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.Gson.fromJson(Gson.java:444)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.Gson.fromJson(Gson.java:396)
10-08 17:07:53.790: E/Volley(31902):    at com.google.gson.Gson.fromJson(Gson.java:372)
10-08 17:07:53.790: E/Volley(31902):    at fr.free.nrw.commons.upload.MwVolleyApi$QueryRequest.parseNetworkResponse(MwVolleyApi.java:140)
10-08 17:07:53.790: E/Volley(31902):    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:123)
10-08 17:07:53.790: E/fr.free.nrw.commons.upload.MwVolleyApi$LogResponseErrorListener(31902): com.android.volley.VolleyError: java.lang.RuntimeException: No-args constructor for class fr.free.nrw.commons.upload.MwVolleyApi$Page does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

Relevant code:

private static class QueryRequest extends JsonRequest<QueryResponse> {
    private static final String TAG = QueryRequest.class.getName();

    public QueryRequest(String url,
                        Response.Listener<QueryResponse> listener,
                        Response.ErrorListener errorListener) {
        super(Request.Method.GET, url, null, listener, errorListener);
    }

    @Override
    protected Response<QueryResponse> parseNetworkResponse(NetworkResponse response) {
        String json = parseString(response);
        QueryResponse queryResponse = GSON.fromJson(json, QueryResponse.class);
        return Response.success(queryResponse, cacheEntry(response));
    }

    private Cache.Entry cacheEntry(NetworkResponse response) {
        return HttpHeaderParser.parseCacheHeaders(response);
    }

    private String parseString(NetworkResponse response) {
        try {
            return new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            return new String(response.data);
        }
    }
}


private static class QueryResponse {
    private Query query = new Query();

    private String printSet() {
        if (categorySet == null || categorySet.isEmpty()) {
            GpsCatExists.setGpsCatExists(false);
            Log.d(TAG, "gpsCatExists=" + GpsCatExists.getGpsCatExists());
            return "No collection of categories";
        } else {
            GpsCatExists.setGpsCatExists(true);
            Log.d(TAG, "gpsCatExists=" + GpsCatExists.getGpsCatExists());
            return "CATEGORIES FOUND" + categorySet.toString();
        }

    }

    @Override
    public String toString() {
        if (query != null) {
            return "query=" + query.toString() + "\n" + printSet();
        } else {
            return "No pages found";
        }
    }
}

private static class Query {
    private Page [] pages;

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder("pages=" + "\n");
        if (pages != null) {
            for (Page page : pages) {
                builder.append(page.toString());
                builder.append("\n");
            }
            builder.replace(builder.length() - 1, builder.length(), "");
            return builder.toString();
        } else {
            return "No pages found";
        }
    }
}

private static class Page {
    private int pageid;
    private int ns;
    private String title;
    private Category[] categories;
    private Category category;

    public Page() {
    }

    @Override
    public String toString() {

        StringBuilder builder = new StringBuilder("PAGEID=" + pageid + " ns=" + ns + " title=" + title + "\n" + " CATEGORIES= ");

        if (categories == null || categories.length == 0) {
            builder.append("no categories exist\n");
        } else {
            for (Category category : categories) {
                builder.append(category.toString());
                builder.append("\n");
                if (category != null) {
                    String categoryString = category.toString().replace("Category:", "");
                    categorySet.add(categoryString);
                }
            }
        }

        categoryList = new ArrayList<String>(categorySet);
        builder.replace(builder.length() - 1, builder.length(), "");
        return builder.toString();
    }
}

private static class Category {
    private String title;

    @Override
    public String toString() {
        return title;
    }
}

解决方案

Gson cannot instantiate private nested classes. Make your Page class public:

public static class Page {...}

这篇关于'没有类的参数构造函数不存在',但它确实存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆