2015-07-20 112 views
0

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

} 

我覺得這個錯誤可能是由於我沒有將該上下文傳遞給該方法,但我無法理解如何解決它。有人能幫我嗎?

+0

如果可能,請不要僅發佈錯誤消息,而是發佈完整的堆棧跟蹤。它也有助於您在* your *代碼中指出引起錯誤的行。對你而言問題:在從數據庫初始化的時候調用returnValues()函數到哪裏(因爲它看起來沒有正確初始化)? – dhke

+0

@dhke我沒有發佈完整的DBHelper類代碼,因爲它與錯誤無關(代碼工作並且數據庫初始化正常),只要我調用Item.setId()方法就會發生錯誤。該方法在我的異步任務中調用DoInBackground方法 – Signo

+0

@dhke我已經發布了完整的堆棧跟蹤! (我編輯了一些名字) – Signo

回答

2

您在代碼中的任何地方都沒有給item一個值,所以它始終是null。此時應更換此塊:

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應該是一個私人領域,因爲它只是在returnValues方法中使用。一個局部變量就足夠了。

相關問題