【问题标题】:How to resolve this nullpointer exception SUNSHINE APP. SIMPLE? onPostExecute如何解决这个空指针异常 SUNSHINE APP。简单的?后执行
【发布时间】:2015-01-02 03:16:56
【问题描述】:

我一直在学习 udacity 课程,并且几乎完成了第 2 课。程序应该使用JSON 上现在解析的数据更新列表视图。除非添加以下代码,否则程序会崩溃:

@Override
    protected void onPostExecute(String[] result) {
        if (result != null) {
            forecastAdapter.clear();
            for (String dayForecastStr : result) {
                forecastAdapter.add(dayForecastStr);
            }
        }
    }

如果该代码不存在,则程序照常运行并记录 json 解析的结果。其他人建议

“确保不要在“onCreateView”中重新定义 mForecastAdapter 并且只有:mForecastAdapter = new ArrayAdapter"

我不确定如何在这之前进行。我的班主任已经有mForecastAdapter = new ArrayAdapter<string>。 oncreateview 上的其余代码只是将数组加载到列表视图中。

我目前的错误日志是:

11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:11 月 5 日星期三 - 清除 - 7/7 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:11 月 6 日星期四 - 下雨 - 12/9 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:11 月 7 日星期五 - 雨 - 12/10 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:星期六,11 月 8 日 - 下雨 - 11 年 12 月 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:11 月 9 日星期日 - 雨 - 15/11 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:Mon, Nov 10 - Clear - 15/12 11-05 19:29:00.049 20310-20553/com.example.jeremy.sunshine V/FetchWeatherTask﹕预测条目:Tue, Nov 11 - Clear - 15/11 11-05 19:29:00.049 20310-20310/com.example.jeremy.sunshine D/AndroidRuntime: 关闭虚拟机 11-05 19:29:00.049 20310-20310/com.example.jeremy.sunshine W/dalvikvm: threadid=1: 线程以未捕获的异常退出 (组=0x415c5db8)11-05 19:29:00.049 20310-20310/com.example.jeremy.sunshine E/AndroidRuntime:致命 例外:主要 进程:com.example.jeremy.sunshine,PID:20310 java.lang.NullPointerException 在 com.example.jeremy.sunshine.ForecastFragment$FetchWeatherTask.onPostExecute(ForecastFragment.java:305) 在 com.example.jeremy.sunshine.ForecastFragment$FetchWeatherTask.onPostExecute(ForecastFragment.java:108) 在 android.os.AsyncTask.finish(AsyncTask.java:632) 在 android.os.AsyncTask.access$600(AsyncTask.java:177) 在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5146) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 在 dalvik.system.NativeStart.main(Native Method)

我的整个班级都可以在这里看到:

由于这是我的第一个 android 项目,我很困惑为什么这不起作用。我想这是我必须忽略的东西。http://pastebin.com/x3rcqbdS

【问题讨论】:

标签: java android json


【解决方案1】:

当您使用以下代码在onCreateView 中初始化您的forecastAdapter 时:

ArrayAdapter<String> forecastAdapter =
            new ArrayAdapter<String>(

您正在创建一个仅在onCreateView 范围内的forecastAdapter 的新实例。然后,当您在 onPostExecute 中使用您的 forecastAdapter 时,forecastAdapter 范围内的 onPostExecute 为空,因为它从未初始化,但另一个实例是(正如 Elliott Frisch 提到的,他刚刚删除了他的回答)。

您应该能够从您的onCreateView 适配器中删除ArrayAdapter&lt;String&gt;,它会起作用。

【讨论】:

  • 你是对的,那部分确实必须去,但我还需要将数组更改为公共而不是私有!非常感谢
【解决方案2】:

我遇到了同样的问题。解决方案是您不能将列表添加到mForecastAdapter,因为根据旧代码我们添加String[] 而不是weekForecast 列表。所以请确保这条线是正确的:

mForecastAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast, R.id.list_item_forecast_textview,weekForecast);

【讨论】:

    【解决方案3】:

    我以前遇到过这个问题。 数组适配器不为空,因为我可以访问它的计数,但我无法清除它或向它添加元素。这是因为我在 onCreateView() 方法中初始化我的数组适配器的方式。我将最后一个参数作为“Arrays.asList(my_array_of_strings)”传递给它

    String[] data = {
                "Mon 6/23 - Sunny - 31/17",
                "Tue 6/24 - Foggy - 21/8",
                "Wed 6/25 - Cloudy - 22/17",
                "Thurs 6/26 - Rainy - 18/11",
                "Fri 6/27 - Foggy - 21/10",
                "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
                "Sun 6/29 - Sunny - 20/7"
        };
    
    arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                R.id.list_item_forecast_textview, Arrays.asList(data));
    

    而最后一个参数应该是“new ArrayList(Arrays.asList(my_array_of_strings))”

    String[] data = {
                "Mon 6/23 - Sunny - 31/17",
                "Tue 6/24 - Foggy - 21/8",
                "Wed 6/25 - Cloudy - 22/17",
                "Thurs 6/26 - Rainy - 18/11",
                "Fri 6/27 - Foggy - 21/10",
                "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
                "Sun 6/29 - Sunny - 20/7"
        };
        List<String> weekForecast = new ArrayList<String>(Arrays.asList(data));
    
        arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                R.id.list_item_forecast_textview, weekForecast);
    

    这是因为 Arrays.asList(array) 和 new ArrayList(Arrays.asList(array)) 之间的区别,如 here 所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多