简体   繁体   English

尝试在空对象引用上调用虚拟方法

[英]Attempt to invoke virtual method on a null object reference

I have as asyncTask, inside the DoInBackground method I call a DBHelper class that should return every row inside a SQLiteDB. 我有一个asyncTask,在DoInBackground方法中调用了DBHelper类,该类应返回SQLiteDB中的每一行。 But when the DBHelper class method to retrieve the values gets fired I get the error: 但是,当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 jav 07-20 10:33:33.869:E / AndroidRuntime(22238):致命例外:AsyncTask#5 07-20 10:33:33.869:E / AndroidRuntime(22238):进程:com.test.test,PID:22238 07 -20 10:33:33.869:E / AndroidRuntime(22238):java.lang.RuntimeException:在执行doInBackground()07-20 10:33:33.869:E / AndroidRuntime(22238):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):在java.util.concurrent.FutureTask.setException(FutureTask.java:222)07-20 10:33:33.869:E / AndroidRuntime(22238):在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 jav a.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 a.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):由以下原因引起:java.lang.NullPointerException:尝试在空对象引用07上调用虚拟方法'void test.ItemFolderP.setId(java.lang.String)' -20 10:33:33.869:E / AndroidRuntime(22238):在test.test.returnValues(testt.java:59)07-20 10:33:33.869:E / AndroidRuntime(22238):在test.test $ GetFProducts .doInBackground(test.java:107)07-20 10:33:33.869:E / AndroidRuntime(22238):在test.test $ GetFProducts.doInBackground(test.java:1)07-20 10:33:33.869:E / AndroidRuntime(22238):位于android.os.AsyncTask $ 2.call(AsyncTask.java:288)07-20 10:33:33.869:E / AndroidRuntime(22238):位于java.util.concurrent.FutureTask.run(FutureTask .java:237)07-20 10:33:33.869:E / AndroidRuntime(22238):...还有4个

This is the code of the DBHelper: 这是DBHelper的代码:

public class DBHelper{  

    private ItemFolderP item; //here I declare my item

Here's the method for retrieving the values 这是获取值的方法

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;
}

And this is the item class: 这是项目类:

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;
}

}

I feel the error might be caused by the fact that I haven't passed the context to the method but I can't understand how to fix it. 我觉得该错误可能是由于我没有将上下文传递给方法,但是我不知道如何解决它。 Can someone help me? 有人能帮我吗?

You are not giving item a value anywhere in the code, so it's always null . 您没有在代码中的任何地方给item赋值,因此它始终为null You should replace this 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")));

with

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")));

Also, I don't think item should be a private field as it is only used within the returnValues method. 另外,我不认为item应该是私有字段,因为它仅在returnValues方法内使用。 A local variable will suffice. 局部变量就足够了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM