#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. Я смог получить доступ к СУБД в коде Ормана. Я опубликовал приведенный выше код.