2011-11-15 65 views
0

我的目標是製作一個名爲「Shopping list」的應用程序。我有3個標籤,第一個叫做:「View list」,第二個是:「Add Market 「和最後一個:」添加產品「。我在第一個和最後一個選項卡上有兩個調整器,從名爲」DATABASE_MARKETTABLE「的SQLite表中填充。在「添加市場」中,我將市場添加到DATABASE_MARKETTABLE。從SQLite填充Spinner時出現空指針異常[Java Android]

我的問題是,從最後一個標籤「添加產品」微調工作得很好,它從DATABASE_MARKETTABLE(所有市場添加),但從「查看列表」(第一個選項卡)微調它獲得所有數據它會拋出一個NULL POINTER例外。

這裏是我的代碼:

DatabaseHelper.class:

public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL("CREATE TABLE " + DATABASE_PRODTABLE + " (" + 
      KEY_PRODROWID + " INTEGER PRIMARY KEY, " + 
      KEY_PRODNAME + " TEXT NOT NULL, " + 
      KEY_PRODAMOUNT + " TEXT NO NULL, " + 
      KEY_AMOUNTTYPE + " TEXT NOT NULL, " + 
      KEY_MARKETID + " LONG);" 
      ); 
    db.execSQL("CREATE TABLE " + DATABASE_MARKETTABLE + " (" + 
      KEY_MARKETROWID + " INTEGER PRIMARY KEY, " + 
      KEY_MARKETNAME + " TEXT NOT NULL);" 
      ); 

    }..... 

      ArrayList<String> getMarkets(){ 
    String[] columns = new String[]{KEY_MARKETROWID, KEY_MARKETNAME}; 
    ArrayList<String> Markets = new ArrayList<String>(); 
    Cursor c= myDatabase.query(DATABASE_MARKETTABLE, columns, null, null, null, null, null); 
    if(c.isLast()) {c.moveToFirst();} 
    int iName = c.getColumnIndex(KEY_MARKETNAME); 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     Markets.add(c.getString(iName)); 

    } 
    return Markets; 
} 

而且在AddProductActiviy.class(添加產品標籤):

public void onStart() 
{ 
    DatabaseHelper info=new DatabaseHelper(this); 
    super.onStart(); 
    try { 
     info.open(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    ArrayList<String> Markets=info.getMarkets(); 
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, Markets); 
    spinDept.setAdapter(spinnerArrayAdapter); 
    info.close(); 


} 

而且在ViewlistActivity.class(Viewlist產品標籤)如果我使用相同的代碼,它會讓我得到NULL POINTER EXCEPTION。

老實說,我沒有任何想法,爲什麼不工作,我試圖失去的解決方案,但沒有任何作品。

我的目標是讓用戶使用該微調器僅顯示與從微調器中選擇的市場相關聯的產品。

編輯:

這裏是我的錯誤:

11-16 00:20:27.594: E/AndroidRuntime(338): FATAL EXCEPTION: main 
11-16 00:20:27.594: E/AndroidRuntime(338): java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.AndroidProjectActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.ViewlistActivity}: java.lang.NullPointerException 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.os.Looper.loop(Looper.java:123) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.main(ActivityThread.java:3683) 
11-16 00:20:27.594: E/AndroidRuntime(338): at java.lang.reflect.Method.invokeNative(Native Method) 
11-16 00:20:27.594: E/AndroidRuntime(338): at java.lang.reflect.Method.invoke(Method.java:507) 
11-16 00:20:27.594: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-16 00:20:27.594: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-16 00:20:27.594: E/AndroidRuntime(338): at dalvik.system.NativeStart.main(Native Method) 
11-16 00:20:27.594: E/AndroidRuntime(338): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{androidpack.namespace/androidpack.namespace.ViewlistActivity}: java.lang.NullPointerException 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.widget.TabHost.addTab(TabHost.java:216) 
11-16 00:20:27.594: E/AndroidRuntime(338): at androidpack.namespace.AndroidProjectActivity.onCreate(AndroidProjectActivity.java:30) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 


11-16 00:20:27.594: E/AndroidRuntime(338): Caused by: java.lang.NullPointerException 
11-16 00:20:27.594: E/AndroidRuntime(338): at androidpack.namespace.ViewlistActivity.onCreate(ViewlistActivity.java:51) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-16 00:20:27.594: E/AndroidRuntime(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

看來,在ViewlistActivity.class的spinDept.setAdapter(spinnerArrayAdapter);是問題,但我不知道爲什麼。

編輯。這是我的視角活動.CLASS

public class ViewlistActivity extends Activity { 
Spinner spinDept; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.spinDept=(Spinner)findViewById(R.id.spinnerprost); 


    // setare continut din layout 
    setContentView(R.layout.viewlist); 
    TextView tv=(TextView)findViewById(R.id.tvSQLinfo); 

    //Afisare produse din baza de date 
    DatabaseHelper info= new DatabaseHelper(ViewlistActivity.this); 
    try { 
     info.open(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String data = info.getData(); 
    info.close(); 
    tv.setText(data); 

    //---------------------------------------------- 
    try { 
     info.open(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    ArrayList<String> Markets=info.getMarkets(); 
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, R.layout.spinner, Markets); 
    spinDept.setAdapter(spinnerArrayAdapter); 
    info.close(); 

} 
+1

你有沒有設置一些調試點,看看是什麼是空?堆棧跟蹤也告訴你到底是哪一行代碼引起了NPE。請張貼,以及。 – Jack

+0

我加了我的錯誤。看來spinDept.setAdapter(spinnerArrayAdapter);是ViewlistActivity.class中的問題(對應於Viewlist選項卡) –

+0

您可以發佈ViewListActivity.class中的代碼,因爲那是您說您認爲Null問題來自哪裏的原因? – Bryan

回答

1

這很可能與問題直接無關。但是:

KEY_MARKETID + " LONG);" 

SQLite does not supportLONG數據類型。我想知道這是如何工作的。可能更改爲INTEGER

+0

它的工作原理:P。在「添加產品」選項卡中從微調器中選擇的產品和市場ID顯示在「視圖列表」選項卡中。問題是ViewList選項卡中的微調不起作用,而來自「添加產品」的微調工作得很好,仍然...我使用相同代碼和同類「getMarkets」。 –

+0

但是,我正在使用與DATABASE_MARKETTABLE相關的第二個db.execSQL。 –

1

你說:

看來,在ViewlistActivity.class的 spinDept.setAdapter(spinnerArrayAdapter);是問題,但我不知道爲什麼 。

空指針異常可能只意味着一件事:某事是空的。

spinDept沒有被實例化,或者spinnerArrayAdapter沒有被實例化。我的猜測是spinDept是NULL,因爲我認爲setAdapter(null)是一個有效的調用(清除適配器)。

編輯:如果你調試所有的方式,但不是過去那行代碼,懸停在變量上或添加一個手錶,其中一個爲空。

+1

閱讀關於如何設置斷點和檢查變量的+1是至關重要的。通過執行這種簡單的檢查來驗證您的代碼是否按計劃運行,可以解決大量的調試和頭部劃傷問題。 – Merlin