【问题标题】:NullPointException in ArrayAdapterArrayAdapter 中的 NullPointErexception
【发布时间】:2013-03-09 19:45:01
【问题描述】:

我在我的 Android 程序中显示一个 ListView,使用 ArrayAdapter 从字符串数组中获取数据。通常,我从 InputStream 获取数据以填充字符串数组,并且 ListView 正确显示。但是,如果我的 InputStream 为空,我将使用字符串值初始化我的数组。发生这种情况时,将 arrayadapter 应用到我的列表视图时,我会收到 NullPointException。
这是我初始化字符串数组的方法。

    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;
   }

这是我创建列表视图的地方:

   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 的工作方式产生影响?有人有建议吗?

好的。我改变了我的逻辑来使用

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

它给了我一个空异常,我会在返回指令中假设,因为错误在 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)

【问题讨论】:

    标签: android android-arrayadapter


    【解决方案1】:

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

    在这种情况下,您将收到 NullPointException 异常,因为您创建了一个 Size 50 的字符串数组,但在 0th position 处仅添加了一项。

    如果您不知道您从 web 服务而不是静态大小数组中获得了多少项目,请使用 ArrayList 而不是 Array 来避免 NullPointException 异常。

    示例:-

    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");
    
     }
    

    【讨论】:

    • 但是当我从输入缓冲区读取数据时,我没有填充数组。那么我应该初始化字符串数组中的所有条目吗?似乎需要做很多额外的工作。
    • @Dave:为什么你不能将项目添加到 ArrayList?只需使用result.add(line) 而不是result[x] = line;
    • 我尝试使用 ArrayList : List result = new ArrayList();但它也给了我一个空异常,即使在将输入数据输入流时也是如此。我正在从 C# 转换为 Java,所以请原谅我在某些领域的幼稚。我不明白的一件事是调试器不会执行我的异步任务,因此我必须将其告知导致问题的原因。
    • 我确实使用了 result.add(line) 并且还使用了:return (String[]) result.toArray();它导致了一个空异常。我可以再试一次,看看能不能缩小范围,确定它的爆炸位置。
    • @Dave :使用 ArrayList 而不是 Array,如果仍然出现错误,请添加带有问题的 logcat 结果。如果你正在扩展 ListActivity,那么请确保你在 xml 中有 ListView id 为android:id="@android:id/list"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多