'没有类的参数构造函数不存在',但它确实存在 [英] 'No args constructor for class does not exist', but it does
问题描述
我收到错误类MwVolleyApi $ Page的No-args构造函数不存在。用Gson注册一个InstanceCreator来解决这个问题
。我已经阅读了这篇文章,发现了两种类型的解决方案,这两种解决方案似乎都不适合我:
- https://github.com/google/gson/issues/135 - 使用静态嵌套类(我做过)
- 类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:
- https://github.com/google/gson/issues/135 - use a static nested class (I did)
- 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屋!