Исключение NullPointerException на устройствах Kindle Fire

#android #nullpointerexception #kindle-fire

#Android #исключение nullpointerexception #kindle-огонь

Вопрос:

Я постоянно получаю эти отчеты о сбоях и не могу понять, почему. Это происходит от Kindle Fire, и, похоже, это единственные устройства, на которых у меня возникают ошибки. У меня его нет для тестирования, но кто-нибудь знает, почему это исключение NullPointerException происходит только на Kindle Fire? Это несовместимо с SQLite? У меня никогда не было никаких проблем на моем собственном тестовом устройстве или каких-либо сообщений о сбоях с других устройств Android. Любая информация будет оценена.

Кроме того, к вашему сведению, я ничего не могу определить из кода, который должен вызывать это исключение NullPointerException, поэтому я не знаю, что заставляет это происходить только на Kindle Fire..

 java.lang.RuntimeException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2035)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2060)
    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1181)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4558)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at org.orman.dbms.ResultList$ResultRow.getColumn(ResultList.java:31)
    at org.orman.mapper.ReverseMapping.map(ReverseMapping.java:51)
    at org.orman.mapper.Model.fetchQuery(Model.java:439)
    at com.appsbydesign.soundfxfree.helpers.SQLiteHelper.getSounds(SQLiteHelper.java:23)
    at com.appsbydesign.soundfxfree.SoundsActivityGrid.onStartSoundsActivityGrid (SoundsActivityGrid.java:260)
    at com.appsbydesign.soundfxfree.SoundsActivityGrid.onStart(SoundsActivityGrid.java)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
    at android.app.Activity.performStart(Activity.java:4646)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2008)
    ... 11 more
 

Вот часть кода из моего вспомогательного класса SQLite, в журнале ошибок указано, что проблема возникла:

 public class SQLiteHelper {

        public static List<Category> getCategories() {
            return Model.fetchAll(Category.class);
        }

        public static List<Sound> getSounds(long categoryId) {
            Query query = ModelQuery.select().from(Sound.class)
                .where(C.eq(Sound.Columns.CATEGORY, categoryId)).getQuery();
            return Model.fetchQuery(query, Sound.class);
        }
 

Строка 23 такая: return Model.fetchQuery(запрос, Sound.class );

Вот часть кода из моего класса SoundActivityGrid, который также вызывается в журнале ошибок. Строка 260 — это случай 1: sounds = SQLiteHelper.getSounds(CategoryID); в коде:

 @Override
protected void onStart() {
    super.onStart();
    switch (activityName) {
    case 1:
        sounds = SQLiteHelper.getSounds(categoryId);
        break;

    case 2:
        sounds = SQLiteHelper.getRecordedCategory(categoryId);
        break;

    case 3:
        sounds = SQLiteHelper.getFavouriteSounds(categoryId);
        break;

    case 5:
        List<Sound> timedSounds = SQLiteHelper.getSounds(categoryId);
        sounds = new ArrayList<Sound>();
        for (Sound sound : timedSounds) {
            EntityList<Sound, Timer> timers = sound.getTimers();
            if (timers.size() > 0) {
                sounds.add(sound);
            }
        }
        break;
    case 7:
        List<Sound> timedSoundsGrid = SQLiteHelper.getSounds(categoryId);
        sounds = new ArrayList<Sound>();
        for (Sound sound : timedSoundsGrid) {
            EntityList<Sound, Timer> timers = sound.getTimers();
            if (timers.size() > 0) {
                sounds.add(sound);
            }
        }
        break;
    case 6:
        sounds = SQLiteHelper.getwidgetPlaySound(categoryId);
        break;

    }
 

У меня нет доступа к org.orman.dbms.

Редактировать:

Я смог получить доступ к коду списка результатов в СУБД orman, и вот что он сказал:

 public class ResultList {
private String[] columnNames;
private Map<String, Integer> columnNameMap;


private Object[][] records;


public final class ResultRow {
    private Map<String, Integer> columnNameMap;
    private Object[] row;


    private ResultRow(Map<String, Integer> columnNameMap, Object[] row) {
        this.columnNameMap = columnNameMap;
        this.row = row;
    }


    public Object getColumn(String columnName) {
        return row[columnNameMap.get(columnName)]; // TODO if column does not exist throw xceptn
    }
}
 

Строка 31 равна:

 return row[columnNameMap.get(columnName)]; // TODO if column does not exist throw xceptn
 

Я не знаю, почему он считает, что столбец не существует. Я не совсем понимаю, как работает код базы данных.

Комментарии:

1. если нет ничего о коде, который должен вызывать это исключение NullPointerException, почему это произошло. Публикация только журналов вам не поможет. Пожалуйста, также опубликуйте соответствующий код.

2. Я опубликовал соответствующий код для ошибки.

3. «У меня нет доступа к org.orman.dbms» — это некоторая библиотека, которую вы используете. Возможно, вам потребуется связаться с авторами этой библиотеки, чтобы определить, почему вы зависаете внутри нее.

4. Прошло много времени с тех пор, как вы отредактировали свой вопрос, и еще больше времени с тех пор, как я опубликовал ответ. Не могли бы вы показать нам код, который сопоставляет поля базы данных с членами класса? Я бы попробовал и сказал, что там опечатка или что-то в этом роде. Если библиотека не может сопоставить результаты с типом данных, я бы подумал, что проблема есть.

5. Но, возможно, вы продвинулись дальше и либо разобрались с проблемой, либо нашли другой способ обойти проблему. Если это так, я бы настоятельно рекомендовал вам ответить на свой вопрос любым решением, которое вы реализовали. В нем есть воображаемые точки доступа в Интернет и значки для вас!

Ответ №1:

Что-то происходит null , когда что-то еще пытается его использовать.

 Caused by: java.lang.NullPointerException
    at org.orman.dbms.ResultList$ResultRow.getColumn(ResultList.java:31)
 

Я бы начал искать там.
Или, если это не ваш пакет, тогда:

 at com.appsbydesign.soundfxfree.helpers.SQLiteHelper.getSounds(SQLiteHelper.java:23)
 

Не видя кода, окружающего эти местоположения, все, кто может это сделать, делают дикие предположения.

Что я могу предположить из stacktrace, так это то, что вы можете проглатывать / перехватывать слишком много исключений без регистрации ошибок. Если вы получите null ResultSet или ResultRow, я бы ожидал, что вы увидите жалобу откуда-нибудь раньше.


Редактировать:

Вы очень усложняете себе задачу. Невероятно сложно точно определить, какой объект или какой метод вас подводит, потому что у вас так много сокращений в каждой строке.

Мое лучшее предположение было бы

 Query query = ModelQuery.select().from(Sound.class)
            .where(C.eq(Sound.Columns.CATEGORY, categoryId)).getQuery();
 

Но то, что вы должны сделать прямо сейчас, это вернуться к своему коду и разделить его на части, чтобы выполнять только одно действие на строку. Тогда, если / когда он снова выйдет из строя, у вас будет гораздо лучшее представление о том, какой именно бит вызывает трудности.

Обновите свой код и stacktrace новыми версиями, и мы увидим, на чем мы остановимся.

Комментарии:

1. Извините, но я не совсем понимаю, что вы подразумеваете под моим сжатым кодом. Я все еще изучаю код Android. Можете ли вы объяснить мне, где код, который я опубликовал, должен быть разделен на части?

2. Я смог получить доступ к СУБД в коде Ормана. Я опубликовал приведенный выше код.