所以我偶然发现了这个错误,每当我尝试从JsonArray对象中删除一个元素时,我都会得到NoSuchMethodException . 但看了它坚实的一天后,我找不到它的原因 . 该方法存在于我的项目中包含的.jar文件中的已编译.class文件中 . 而我现在正处于亏损状态 . 当然问题出在椅子和键盘之间,但我只是看不到它
编辑:编译项目后我没有得到这个错误,所以这必须做一些eclipse如何管理依赖项,因为一个项目确实使用gson-2.2.4
我正在使用gson 2.3 jar,我通过maven包含它甚至下载了jar文件本身 .
抛出错误的示例代码段:
else if (current.isJsonObject() && hasBucket(current)) {
JsonElement buckets = current.getAsJsonObject().get(BUCKETS);
JsonElement next = null;
if (buckets.isJsonArray() && buckets.getAsJsonArray().size()>0) {
JsonArray arr = buckets.getAsJsonArray();
arr.remove(0); //<--- exception is thrown here
} else if (buckets.isJsonObject()) {
Set<Entry<String,JsonElement>> entrySet = buckets.getAsJsonObject().entrySet();
for (Entry<String, JsonElement> entry : entrySet) {
next = entry.getValue();
buckets.getAsJsonObject().remove(entry.getKey());
break;
}
}
}
当我使用maven编译我的项目时,我可以看到maven正在使用gson 2.3
[INFO] Expanding: /Users/####/.m2/repository/com/google/code/gson/gson/2.3/gson-2.3.jar into /Users/####/Documents/workspace/proj_name/target/assembly/work/gson-2.3.jar
从我的java项目的类路径中的jar文件输出 javap ~/Downloads/gson-2.3/com/google/gson/JsonArray.class
Compiled from "JsonArray.java"
public final class com.google.gson.JsonArray extends com.google.gson.JsonElement implements java.lang.Iterable {
public com.google.gson.JsonArray();
com.google.gson.JsonArray deepCopy();
public void add(com.google.gson.JsonElement);
public void addAll(com.google.gson.JsonArray);
public com.google.gson.JsonElement set(int, com.google.gson.JsonElement);
public boolean remove(com.google.gson.JsonElement);
public com.google.gson.JsonElement remove(int); <---- It exists!
public boolean contains(com.google.gson.JsonElement);
public int size();
public java.util.Iterator iterator();
public com.google.gson.JsonElement get(int);
public java.lang.Number getAsNumber();
public java.lang.String getAsString();
public double getAsDouble();
public java.math.BigDecimal getAsBigDecimal();
public java.math.BigInteger getAsBigInteger();
public float getAsFloat();
public long getAsLong();
public int getAsInt();
public byte getAsByte();
public char getAsCharacter();
public short getAsShort();
public boolean getAsBoolean();
public boolean equals(java.lang.Object);
public int hashCode();
com.google.gson.JsonElement deepCopy();
}
2 回答
您的构建设置有问题 .
JsonArray.remove(int)是在Gson 2.3版本中引入的 . 最有可能发生的事情是您正在编译正确的版本(2.3),但在APK中打包的版本不是正确的版本 .
您正在尝试修改正在迭代的集合 .
除了避免滥用调用toThisThat,你应该迭代集合并在必要时插入结果,然后分配整个事物 . 删除前一个元素后,其中一个元素将变为null .