2012-06-27 26 views
1

我正在使用以下代码。arrayadapter和nullpointer错误的意外行为

mDbHelper.open(); 
     String[] areasList = new String[51]; 
     for (int i = 0; i<51; i ++) 
     { 
      areasList[i] = ""; 
     } 
     areasList = mDbHelper.getAllAreas(); 
     mDbHelper.close(); 

     ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, areasList); 
     spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     chooseArea.setAdapter(spinnerArrayAdapter); 

在调试它显示了从数据库中获取的的String[]所有值。

public String[] getAllAreas() 
    { 
     String[] areasList = new String[51]; 
     String queryString = "SELECT areaName FROM TFTaxi"; 
     Cursor resultSet = mDb.rawQuery(queryString, null); 
     for (int i = 0; i<51; i ++) 
     { 
      areasList[i] = ""; 
     } 
     int i = 1; 
     areasList[0] = "Choose your Area"; 

     while(resultSet.moveToNext()) 
     { 

      areasList[i] = resultSet.getString(resultSet.getColumnIndex("areaName")); 
      i++; 
     } 

     resultSet.close(); 
     return areasList; 
    } 

但随后给出了上面的错误错误

06-27 23:40:43.882: E/AndroidRuntime(16467): FATAL EXCEPTION: main 
06-27 23:40:43.882: E/AndroidRuntime(16467): java.lang.NullPointerException 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.Spinner.onMeasure(Spinner.java:285) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.View.measure(View.java:12723) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.os.Looper.loop(Looper.java:137) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at java.lang.reflect.Method.invokeNative(Native Method) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at java.lang.reflect.Method.invoke(Method.java:511) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at dalvik.system.NativeStart.main(Native Method) 
+0

你的阵列的初始化代码调用areasList = mDbHelper.getAllAreas前();没有效果。你可以删除它。 除此之外:你是否确认你的数据库不*包含空值? (你可以通过约束NOT NULL来强制执行)。 – tiguchi

回答

1
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
06-27 23:40:43.882: E/AndroidRuntime(16467): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 

很明显的错误是由于任何areasList的[i]为空.... see line 394

文本.setText(item.toString());

  • 迭代之前将光标设置为第一个cursor.moveToFirst()。

cursor.moveToFirst(); 
     do { 


     } while (cursor.moveToNext()); 
+0

不工作的队友,因为我已经说过,我的调试器显示整个51值的字符串,没有空字符:( –

+0

然后文本(TextView)可能为空,这也是在394让我检查 –

+0

请更新最后的代码,并告诉哪里你检查了所有字符串的51个值,没有空字符 –

0

resultSet.moveToNext() - 移动到下一个,所以我的猜测是,你只跳过从数据库中的第一项(即使光标包含的项目的正确数量 - 50)。

尝试从前提while(resultSet.moveToNext()) {}切换到后置条件do {} while(resultSet.moveToNext())

+0

我的调试器在整个String中显示无空值[ ] –

+0

@umar:那么我只是出于想法,对不起.. –

0

我想你通过处理记录之前调用使用MoveToNext跳过一个结果记录。

假设你的查询返回50个记录尝试这种变化:

public String[] getAllAreas() 
    { 
     ..... 
     resultSet.moveToFirst(); 
     while(!resultSet.isAfterLast()) 
     { 
      areasList[i] = resultSet.getString(resultSet.getColumnIndex("areaName")); 
      i++; 
      resultSet.moveToNext(); 
     } 
     ......... 
    }