2012-11-22 14 views
0

我使用公共類將2條信息保存到一個數組(因此我可以輕鬆獲取該名稱和ID)。但由於某種原因,它似乎並不喜歡它!Android:使用屬性時的空指針異常

我收到就行了以下錯誤: -

AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID"));

Null pointer access: The variable details can only be null at this location 
是具有錯誤

我的代碼是:

public static List<clsNameID> assetHelperTypes(){ 
    Log.e("Asset Helper Types:", "Started"); 
    clsNameID AssetDetails = null; 
    List<clsNameID> mHelperNames = new ArrayList<clsNameID>(); 
    File dbfile = new File(Global.currentDBfull); 

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
    Cursor f = db.rawQuery("select * from assetobservationtypes", null); 
    Log.e("Asset Helper Types:", "Cursor run"); 
     if(f.getCount() != 0) { 
     f.moveToFirst(); 
      while(!f.isAfterLast()) { 
       Log.e("Asset Helper Types:", "Finding Items"); 

       AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID")); 
       AssetDetails.Name = f.getString(f.getColumnIndex("Observation")); 

       mHelperNames.add(AssetDetails); 
       Log.e("Asset Helper Types:", "Added Items"); 
      } 
     } 
    f.close(); 

    return mHelperNames; 
} 

類clsNameID: -

package com.directenquiries.assessment.tool; 

public class clsNameID { 
    public String Name; 
    public String ID; 

} 

我試圖與調用它:

public void addCondition(View view){ 


     List<clsNameID> mHelperNames = DBFunctions.assetHelperTypes(); 


     final List<Integer> mSelectedItems = new ArrayList<Integer>(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("My Title") 
       .setMultiChoiceItems(mHelperNames.toArray(new CharSequence[mHelperNames.size()]), null, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
            int which, boolean isChecked) { 
           if (isChecked) { 

            mSelectedItems.add(which); 
           } else if (mSelectedItems.contains(which)) { 

            mSelectedItems.remove(Integer 
              .valueOf(which)); 
           } 
          } 
         }) 

       .setPositiveButton("Save", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         //Create onlcick method 
        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         //Create onlcick method 
        } 
       }); 
     builder.show(); 

} 
+1

郵政完整的堆棧跟蹤,請」 –

+0

你永遠不會初始化'AssetDetails' ,其無效。並且你正試圖訪問它上面的'ID'。 – PermGenError

回答

1

你是不是通過調用new運營商,這就是爲什麼你的對象AssetDetails爲空創建clsNameID的對象。我只是添加了行來創建對象..檢查出我的評論「添加此行..」行。

public static List<clsNameID> assetHelperTypes(){ 
    Log.e("Asset Helper Types:", "Started"); 
    clsNameID AssetDetails = null; 
    List<clsNameID> mHelperNames = new ArrayList<clsNameID>(); 
    File dbfile = new File(Global.currentDBfull); 

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
    Cursor f = db.rawQuery("select * from assetobservationtypes", null); 
    Log.e("Asset Helper Types:", "Cursor run"); 
     if(f.getCount() != 0) { 
     f.moveToFirst(); 
      while(!f.isAfterLast()) { 
          //add this line.... 
          AssetDetails  = new clsNameID(); 
       Log.e("Asset Helper Types:", "Finding Items"); 

       AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID")); 
       AssetDetails.Name = f.getString(f.getColumnIndex("Observation")); 

       mHelperNames.add(AssetDetails); 
       Log.e("Asset Helper Types:", "Added Items"); 
      } 
     } 
    f.close(); 

    return mHelperNames; 
} 

希望它可以幫助...

+0

麻煩解釋你做了什麼改變。否則它不會有太大的幫助。 –

+0

用我的評論'添加此行'檢查該行 –

+1

您沒有通過調用新的... –

0

首先,在Java類的名稱應該以大寫字母開頭,讓您的自定義類應該叫ClsNameID。此外,變量應以小寫字母開頭,因此您稱爲AssetDetails的引用應該是assetDetails,並且類似地,對於IDName

一旦你做出這些變化則更爲明顯,當你訪問它正在對類的實例進行,而不是在類的static性能IDName領域。比較兩段代碼:

clsNameID AssetDetails = null; 
... 
AssetDetails.ID = f.getString(f.getColumnIndex("AssetObsID")); 
AssetDetails.Name = f.getString(f.getColumnIndex("Observation")); 

ClsNameID assetDetails = null; 
... 
assetDetails.id = f.getString(f.getColumnIndex("AssetObsID")); 
assetDetails.name = f.getString(f.getColumnIndex("Observation")); 

這是很容易地看到,錯誤已經取得寫入第二組的代碼,如assetDetails顯然應該是一個實例,而第一組代碼不明確且令人困惑。

解決您的問題,你應該做的其他海報狀態,並且您嘗試使用它之前創建類的實例:

ClsNameID assetDetails = new ClsNameID();