如何解决这个nullpointer异常SUNSHINE APP。简单? onPostExecute

时间:2014-11-05 19:31:55

标签: java android json

我一直在关注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上的其余代码只是将数组加载到listview中。

我目前的错误日志是:

  

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日星期六 - 雨 - 12/11       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:预测参赛作品:周一,11月10日 - 晴朗 - 15/12 11-05   19:29:00.049 20310-20553 / com.example.jeremy.sunshine   V / FetchWeatherTask:预测条目:11月11日星期二 - 晴 - 15/11       11-05 19:29:00.049 20310-20310 / com.example.jeremy.sunshine D / AndroidRuntime:关闭VM       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)               at 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(本地方法)

我的全班同学都可以在这里看到:

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

3 个答案:

答案 0 :(得分:3)

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

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

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

您应该只能从ArrayAdapter<String>适配器中删除onCreateView,它就能正常运行。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

之前我遇到过这个问题。 数组适配器不是null,因为我可以访问它的计数,但我无法清除它或添加元素。这是因为我在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所述。