NoSuchMethodException в Gson JsonArray

Поэтому я наткнулся на эту ошибку, всякий раз, когда я пытаюсь удалить элемент из объекта JsonArray, я получаю исключение NoSuchMethodException. Но, посмотрев на него в течение солидного дня, я не могу найти причину этого. Метод существует в скомпилированном файле.class в файле.jar, который включен в мой проект. И теперь я в ужасе. Конечно, проблема между стулом и клавиатурой, но я просто не вижу ее

EDIT: после компиляции проекта я не получаю эту ошибку, так что это должно что-то сделать с тем, как 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;
 }
 }
}
</string,></entry<string,jsonelement>

когда я компилирую свой проект с помощью 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

вывод javap ~/Downloads/gson-2.3/com/google/gson/JsonArray.class из файла jar, который находится в пути к классам моего проекта java

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 ****** ***********();
 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) был введен в версии 2.3 Gson. Скорее всего, происходит то, что вы компилируете против правильной версии (2.3), но версия, которая упаковывается в ваш APK, не является правильной версией.


Вы пытаетесь изменить коллекцию, которую вы итерируете.

Помимо того, что вы избегаете злоупотреблений при вызове toThis и toThat, вы должны итерировать коллекцию и вставлять результат в случае необходимости, а затем назначать все это. Один из элементов имеет значение null после того, как вы удалили предыдущий или около того.

licensed under cc by-sa 3.0 with attribution.