我的应用程序在我的设备上与NPE崩溃。在使用ACRA收到的堆栈跟踪中,行号指的是两个源代码类SQLiteStatement
和SQLiteDatabase
。对于SQLiteDatabase
,没有任何行号与任何源代码版本中的行号匹配。我的设备没有自定义ROM。这是运行Android 4.03的Galaxy S2。
这是堆栈跟踪:
java.lang.NullPointerException
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2025)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1965)
at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:690)
at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:605)
at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:247)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1844)
at com.mydomain.myapp.albums.AlbumsData.insertOrIgnore(AlbumsData.java:89)
如果您查看its different versions中SQLiteDataBase
的来源,您可以自行检查数字是否匹配。
例如,在Android 4.03的SQLiteDataBase
source中,executesql(...)
位于第1892行,而我的堆栈跟踪显示它位于第2025行。
这怎么可能?
(请注意我不询问NPE的来源)
答案 0 :(得分:2)
所有内部错误都是由代码中的这一行引起的:
com.mydomain.myapp.albums.AlbumsData.insertOrIgnore(AlbumsData.java:89)
你需要去了解它并弄清楚它是怎么回事。我同意@ 323go你可能会传递某种类型的空值。一旦你得到照顾内部的东西应该消失。
至于为什么行号不同。您正在查看裸骨库存系统源代码。当它进入设备并进入消费者手中时,它可能会被改变一点点,我不知道具体为什么或它们会在SQLiteDatabase
类中改变但看起来它们已经改变了东西。
答案 1 :(得分:1)
我不确定官方的android源码与手机上的Android版本相匹配。我认为三星可能因为它自己的目的改变了android:三星家伙拿了android 4.0.3来源,修改了它们,在不同的类中添加了一些东西(SQLiteDatabase
似乎是其中之一),然后构建它并得到了自己的android的版本。他们没有修改显示android版本的常量,所以你可以看到它仍然是'4.0'。