【问题标题】:Null Pointer Exception when populate a Spinner from SQLite.[Java Android]从 SQLite 填充 Spinner 时出现空指针异常。[Java Android]
【发布时间】:2011-12-29 23:09:19
【问题描述】:

我的目标是制作一个名为“购物清单”的应用程序。我有 3 个选项卡,第一个名为:“查看列表”,第二个是:“添加市场”,最后一个是:“添加产品”。我有 2 个微调器在第一个和最后一个选项卡上,从名为“DATABASE_MARKETTABLE”的 SQLite 表填充。在“添加市场”中,我将市场添加到 DATABASE_MARKETTABLE。

我的问题是最后一个选项卡“添加产品”中的微调器工作得很好,它从 DATABASE_MARKETTABLE 获取所有数据(添加了所有市场),但来自“查看列表”(第一个选项卡)的微调器向我抛出了一个 NULL POINTER EXCEPTION .

这是我的代码:

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);是问题,但我不知道为什么。

编辑。这是我的 VIEWLISTACTIVITY.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();

}

【问题讨论】:

  • 您是否设置了一些调试点来查看究竟什么是空?堆栈跟踪还可以准确地告诉您导致 NPE 的代码行。请同时发布。
  • 我添加了我的错误。似乎 spinDept.setAdapter(spinnerArrayAdapter);是问题所在,在 ViewlistActivity.class 中(对应于 Viewlist Tab)
  • 您能否发布 ViewListActivity.class 中的代码,因为您是说您认为 Null 问题源于此?
  • 这很奇怪。现在它不会抛出任何异常,只是不会在 Viewlist Tab spinner 中显示任何内容,并且 Add Product tab spinner 工作得很好。
  • 布局文件呢?您在 ViewListActivity 类中使​​用了不同的布局文件。由于在调用 setAdapter 时设置的代码除了使用的布局外是相同的,所以我会比较两者,看看是否有遗漏或错误。

标签: java android database sqlite spinner


【解决方案1】:

这很可能与问题没有直接关系。然而:

KEY_MARKETID + " LONG);"

SQLite does not supportLONG 数据类型。我想知道这到底是怎么工作的。大概换成INTEGER吧。

【讨论】:

  • 它有效:P。从“添加产品”选项卡中的微调器中选择的产品和市场 id 显示在 Viewlist 选项卡中。问题是为什么 ViewList 选项卡中的微调器不起作用,而添加产品中的微调器工作得很好,而且仍然......我使用的是相同的代码和同一类“getMarkets”。
  • 但是,我正在使用与 DATABASE_MARKETTABLE 相关的第二个 db.execSQL。
【解决方案2】:

你说:

似乎在 ViewlistActivity.class 中 spinDept.setAdapter(spinnerArrayAdapter);是问题,但我没有 知道为什么。

空指针异常只能表示一件事:某事为空。

要么 spinDept 未实例化,要么 spinnerArrayAdapter 未实例化。我的猜测是 spinDept 是 NULL,因为我认为 setAdapter(null) 是一个有效的调用(清除适配器)。

编辑:如果您一直调试到但不超过那行代码,请将鼠标悬停在变量上或添加一个手表,其中一个为空。

【讨论】:

  • +1 阅读如何设置断点和检查变量是必不可少的。通过执行这个简单的检查来验证您的代码是否按计划运行,可以解决很多调试问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多