我有一个 asyncTask,在 DoInBackground 方法中我调用一个 DBHelper 类,该类应该返回 SQLiteDB 中的每一行。但是,当检索值的 DBHelper 类方法被触发时,我收到错误:
07-20 10:33:33.869: E/AndroidRuntime(22238): FATAL EXCEPTION: AsyncTask #5 07-20 10:33:33.869: E/AndroidRuntime(22238): Process: com.test.test, PID: 22238 07-20 10:33:33.869: E/AndroidRuntime(22238): java.lang.RuntimeException: An error occured while executing doInBackground() 07-20 10:33:33.869: E/AndroidRuntime(22238): at android.os.AsyncTask$3.done(AsyncTask.java:300) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.FutureTask.run(FutureTask.java:242) 07-20 10:33:33.869: E/AndroidRuntime(22238): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.lang.Thread.run(Thread.java:818) 07-20 10:33:33.869: E/AndroidRuntime(22238): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void test.ItemFolderP.setId(java.lang.String)' on a null object reference 07-20 10:33:33.869: E/AndroidRuntime(22238): at test.test.returnValues(testt.java:59) 07-20 10:33:33.869: E/AndroidRuntime(22238): at test.test$GetFProducts.doInBackground(test.java:107) 07-20 10:33:33.869: E/AndroidRuntime(22238): at test.test$GetFProducts.doInBackground(test.java:1) 07-20 10:33:33.869: E/AndroidRuntime(22238): at android.os.AsyncTask$2.call(AsyncTask.java:288) 07-20 10:33:33.869: E/AndroidRuntime(22238): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 07-20 10:33:33.869: E/AndroidRuntime(22238): ... 4 more
这是DBHelper的代码:
public class DBHelper{
private ItemFolderP item; //here I declare my item
这是检索值的方法
public ItemFolderP returnValues(int index){
Cursor mRow= database.rawQuery("select * from " + CM_TABLE + " LIMIT 0, 4", null);
if (null!=mRow) {
mRow.moveToNext();
item.setId(Integer.toString(mRow.getInt(mRow.getColumnIndex("Id"))));
item.setTitle(mRow.getString(mRow.getColumnIndex("test")));
item.setCode(mRow.getString(mRow.getColumnIndex("code")));
item.setPrice(mRow.getString(mRow.getColumnIndex("price")));
item.setImageUrl(mRow.getString(mRow.getColumnIndex("url")));
}
return item;
}
这是项目类别:
public class ItemFolderP {
public String id;
public String title;
public String codice;
public String price;
public String imageUrl;
public ItemFolderP(String id, String title, String codice, String price, String imageUrl) {
super();
this.title = title;
this.id = id;
this.price = price;
this.imageUrl = imageUrl;
}
//titolo
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
//id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//codice
public String getCode() {
return title;
}
public void setCode(String codice) {
this.title = codice;
}
//image Url
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
//id
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
我觉得该错误可能是由于我没有将上下文传递给该方法而引起的,但我不明白如何修复它。有人可以帮助我吗?
最佳答案
您没有在代码中的任何位置为 item
赋予值,因此它始终为 null
。您应该替换此 block :
item.setId(Integer.toString(mRow.getInt(mRow.getColumnIndex("Id"))));
item.setTitle(mRow.getString(mRow.getColumnIndex("test")));
item.setCode(mRow.getString(mRow.getColumnIndex("code")));
item.setPrice(mRow.getString(mRow.getColumnIndex("price")));
item.setImageUrl(mRow.getString(mRow.getColumnIndex("url")));
与
item = new ItemFolderP(
Integer.toString(mRow.getInt(mRow.getColumnIndex("Id"))),
mRow.getString(mRow.getColumnIndex("test")),
mRow.getString(mRow.getColumnIndex("code")),
mRow.getString(mRow.getColumnIndex("price")),
mRow.getString(mRow.getColumnIndex("url")));
此外,我认为 item
不应该是私有(private)字段,因为它仅在 returnValues
方法中使用。一个局部变量就足够了。
关于java - 尝试在空对象引用上调用虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31511853/