NullPointException in ArrayAdapter



我在我的Android程序中显示一个ListView使用ArrayAdapter从字符串数组中获取数据。通常,我从InputStream获取数据来填充字符串数组,并且ListView正确显示。然而,如果我的InputStream是空的,我用一个字符串值初始化我的数组。当这种情况发生时,我得到一个NullPointException当应用arrayadapter到我的listview。
下面是我如何初始化字符串数组。

    protected String[] doInBackground(Void...parameters ) {
  .........  do something
   String[] result = new String[50];
   result[0] = "No restaurants found in this area";
      .......  get my httpconnection

我是这样填充字符串数组的:

  ........
  if(responseCode == HttpURLConnection.HTTP_OK) {
    InputStream in = httpConnection.getInputStream();
    BufferedReader br = new BufferedReader(
        new InputStreamReader(in));
  String line;
int x=0;
while ((line = br.readLine()) != null) {
    result[x] = line;
    x++;
} 
    return result;
   }

这是我创建Listview的地方:

   protected void onPostExecute(String[] result) {
        ListView restaurant_list = (ListView) findViewById(R.id.restaurant_list);
        final ArrayAdapter<String> arrayAdpt = new ArrayAdapter<String>(getApplicationContext(), R.layout.listview, R.id.viewtext, result);
        restaurant_list.setAdapter(arrayAdpt);
    }

如果我从输入流中获得数据,一切都可以工作。如果我没有得到任何数据,字符串数组只包含我的初始化值,程序在list.setAdapter(arrayAdpt)行(最后一行)处爆炸。此外,该处理是在doInBackground方法下的异步任务(AsynTask)下完成的。为什么我在字符串数组中的数据源会对arrayadapter的工作方式产生影响?有人有什么建议吗?

Ok。我将逻辑改为使用

 List<String> result = new ArrayList<String>();
 .....
 result.add(line);
 .....
  return (String[]) result.toArray();

它给了我一个nullexception,我会假设在返回指令,因为错误是在doInBackground方法。下面是来自logcat的错误。

  03-09 20:03:13.755: E/AndroidRuntime(6089): FATAL EXCEPTION: AsyncTask #1
  03-09 20:03:13.755: E/AndroidRuntime(6089): java.lang.RuntimeException: An error occured while executing doInBackground()
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at android.os.AsyncTask$3.done(AsyncTask.java:299)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at java.util.concurrent.FutureTask.run(FutureTask.java:239)
  03-09 20:03:13.755: E/AndroidRuntime(6089):   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.lang.Thread.run(Thread.java:856)
   03-09 20:03:13.755: E/AndroidRuntime(6089): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:173)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at com.example.herb4.MainActivity$GetRestaurant.doInBackground(MainActivity.java:1)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
   03-09 20:03:13.755: E/AndroidRuntime(6089):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)

如果我的InputStream是空的,我用一个字符串值初始化我的数组

在这种情况下,你得到NullPointException异常,因为你已经创建了Size 50的字符串数组,但在0th position只添加了一个项目。

避免NullPointException异常使用ArrayList代替数组,如果你不知道有多少项目你从webservice而不是静态大小数组。

: -

ArrayList<String> result=new ArrayList<String>();
if(<Stream not empty>){
  //Add all elemnts to ArrayList
  result.add(line);
}
else{
   result.add("No restaurants found in this area");
 }

最新更新