2013-06-07 3 views
1

Это действительно странно, Google Developer Console, страница с сообщениями об ошибках.Исключение java.lang.NoSuchMethodError на java.util.Deque.push

Как представляется, мое приложение вылетает на нескольких устройствах Android. Бревно исключения при условии, говорит:

java.lang.NoSuchMethodError: java.util.Deque.push 
at com.larvalabs.svgandroid.SVGParser$SVGHandler.<init>(SVGParser.java:869) 
at com.larvalabs.svgandroid.SVGBuilder.build(SVGBuilder.java:147) 
at myapp.graphic.PictureCache.getSvgPicture(PictureCache.java:59) 
at myapp.graphic.PictureCache.getSvgPictureDrawable(PictureCache.java:65) 
at myapp.activities.startup.ActivityStartup.setupCustomGraphic(ActivityStartup.java:92) 
at myapp.activities.startup.ActivityStartup.onCreate(ActivityStartup.java:35) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
... 

Я использую эту библиотеку:

http://code.google.com/p/svg-android-2/

Я включил источник треск, а не просто связал внешнюю библиотеку.

Код, кажется, не работает java.util.Deque.push (NoSuchMethodError). Это не проблема с исходным кодом, который я скопировал и вставил, кажется, что во время выполнения не обнаружен метод dequeue! Как это возможно? Не представляю.

EDIT: Deque это определить:

Deque<Matrix> matrixStack = new LinkedList<Matrix>(); 

код, который поднимают проблему:

matrixStack.push(new Matrix()); 

Возможно ли, что new Matrix() возвращает значение, которое не принято в push() метод?

+1

проверить, если вы обновили adt до rev 22? если это так, щелкните правой кнопкой мыши по пути создания проекта java, выберите вкладку экспорта заказа, убедитесь, что вы проверили частные библиотеки Android для вашего проекта и проекта Android. Это всего лишь предложение. – Raghunandan

+0

Похоже, что java.util.Deque.push представлен на Java.6 и может быть недоступен в более старых версиях. Я предлагаю вам проверить среду времени выполнения на устройствах, где приложение не работает. –

+1

@scubadiver Но подождите ... 'Deque' даже не присутствовал в Java 5, поэтому он должен завершиться неудачей с помощью java.lang.NoClassDefFoundError: java.util.Deque' на версиях старше, чем Java 6. Возможно, в библиотеке Android Java 6 или 7, но не содержит метода push. – gparyani

ответ

1

Ваш проект ссылается java.util.Deque, который был только добавлен в уровне API 9

(http://developer.android.com/reference/java/util/Deque.html)

Устройства с уровнем API < 9 будут терпеть неудачу, поскольку они не могут вызвать этот класс/метод, поскольку он не существует на них.

+0

У меня андроид: minSdkVersion = "8" и андроид: minSdkVersion = "8" в моем manifest.xml, и я не вижу ошибки компиляции/предупреждения (я использую библиотеки Android 2.3.3)! –

+0

Deque также существует в вашем JDK (с 1.6), поэтому он, вероятно, не предупреждает вас. Однако во время выполнения на устройствах <9 он не работает. Я не специалист по работе с предупреждениями. Я уверен, что это ваша проблема. Вы тестировали устройство с уровнем API <9? –

+0

Проблема возникает из-за того, что я использую Android 2.3.3 (Api 9), когда андроид: minSdkVersion = "8" android: targetSdkVersion = "8". Решено, после внесения вклада от Ken, установив android: minSdkVersion = "9" android: targetSdkVersion = "9". –

0

Dequeu.push (E e) требует ввода типа объекта.
Декларация Dequeu в порядке, но _ _.push (новая матрица()) должна вызывать проблемы., Br. У вас есть поле данных, которое вы хотите нажать, чтобы объявить экземпляр матрицы, который содержит поля данных, а затем нажмите на Deque.

Вот пример кода, надеюсь, что это поможет

import java.util.*; 

public class DequeExample { 
    private static Matrix matrix = new Matrix(); 
    private static Deque<Matrix> deque = new LinkedList<Matrix>(); 

    public static void main(String[] args) { 
     for (int i = 0; i < 10; i++) { 
      matrix.setValues(i * i, (float)Math.pow(i, 5.6f), new String("String " + Integer.toString(i))); 
      deque.push(matrix); 
     } 

     System.out.println(deque.size()); 
    } 

    static class Matrix { 
     private int i = 0; 
     private float j = 0f; 
     private String k = "null"; 

     public void setValues(int _i, float _j, String _k) { 
      matrix.i = _i; 
      matrix.j = _j; 
      matrix.k = _k; 
     } 
    } 
}