【问题标题】:NullPointerException on Kindle Fire devicesKindle Fire 设备上的 NullPointerException
【发布时间】:2014-08-05 00:41:19
【问题描述】:

我不断收到这些崩溃报告,但我不知道为什么。这来自 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 Helper 类中的部分代码,错误日志表明问题来自:

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(query, 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 dbms 中的 ResultList 代码,这就是它所说的:

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

我不知道为什么它认为列不存在。我不完全理解数据库代码是如何工作的。

【问题讨论】:

  • 如果与导致此 NullPointerException 的代码无关,为什么会发生这种情况。仅发布日志不会对您有所帮助。也请发布相关代码。
  • 我已经发布了错误的相关代码。
  • “我无权访问 org.orman.dbms”——这是您正在使用的某个库。您可能需要联系该库的作者以确定您在其中崩溃的原因。
  • 您已经有一段时间没有编辑您的问题了,而且距离我发布答案的时间更长。您能否向我们展示将数据库字段映射到类成员的代码?我会刺伤并说那里有错字或其他东西。如果库无法将结果映射到数据类型,那么我认为问题就在那里。
  • 但是您可能已经继续前进,要么解决了问题,要么找到了解决问题的其他方法。如果是这种情况,我会敦促你用你实施的任何解决方案来回答你自己的问题。里面有你想象中的互联网积分和徽章!

标签: android nullpointerexception kindle-fire


【解决方案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)

如果没有看到这些位置周围的代码,任何人都可以做出疯狂的猜测。

我可以从堆栈跟踪中推测出,您可能在没有记录错误的情况下吞下/捕获了太多异常。如果您收到 null ResultSet 或 ResultRow,我希望您应该在更早的地方看到投诉。


编辑:

你让自己很难受。很难准确地指出哪个对象或哪种方法让您失望,因为您在每一行都浓缩了很多东西。

我最好的猜测是

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

但是您现在应该做的是返回您的代码并将其拆分,以便您只执行每行一个操作。然后,如果/当它再次崩溃时,您将更好地了解究竟是哪个位导致了困难。

使用新版本更新您的代码和堆栈跟踪,然后我们将看到我们的立场。

【讨论】:

  • 对不起,我不太明白你的意思是我的代码被压缩了。我还在学习android代码。你能解释一下我发布的代码需要在哪里拆分吗?
  • 我能够访问 orman 代码中的 dbms。我把上面的代码贴出来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多