异步任务返回空指针

2024-03-04

我正在尝试使用访问服务器上的文件asynctask,这是我的代码:

new PostTask().execute("http://antoniofalcone.it/fantavoti/gazz.csv");
@Override
protected String doInBackground(String... params) {
   String url=params[0];

    HttpGet httpGet = new HttpGet(url);
    HttpResponse response = null;
    try {
        response = httpClient.execute(httpGet, localContext);
    } catch (ClientProtocolException e) {
        Log.d("clientprotocol", log2);
        e.printStackTrace();
    } catch (IOException e) {
        Log.d("IOexception: ", log2);
        e.printStackTrace();
    }

    try {
        reader = new BufferedReader(
                new InputStreamReader(
                        response.getEntity().getContent()
                        )
                );
    } catch (IllegalStateException e) {
        Log.d("Illegalstate: ", log2);
        e.printStackTrace();
    } catch (IOException e) {
        Log.d("IOException2 ", log2);
        e.printStackTrace();
    }
   return "All Done!";
}

@Override
protected void onProgressUpdate(Integer... values) {
   super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(String result) {
   super.onPostExecute(result);
}
}

我必须读取该 csv 文件,但我得到了Nullpointerexception on the BufferedReader ("reader")。处理资产目录中的本地文件就可以了。 谁能帮我?

这是完整的日志:

08-31 18:16:54.930: W/dalvikvm(2218): threadid=1: thread exiting with uncaught exception (group=0xa4ceeb20)
08-31 18:16:54.930: E/AndroidRuntime(2218): FATAL EXCEPTION: main
08-31 18:16:54.930: E/AndroidRuntime(2218): Process: com.falc1.fantacalcio2, PID: 2218
08-31 18:16:54.930: E/AndroidRuntime(2218): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.falc1.fantacalcio2/com.falc1.fantacalcio2.MainActivity}: java.lang.NullPointerException
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.os.Looper.loop(Looper.java:136)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at java.lang.reflect.Method.invokeNative(Native Method)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at java.lang.reflect.Method.invoke(Method.java:515)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at dalvik.system.NativeStart.main(Native Method)
08-31 18:16:54.930: E/AndroidRuntime(2218): Caused by: java.lang.NullPointerException
08-31 18:16:54.930: E/AndroidRuntime(2218):     at fragments.VotiFragment.readCsv(VotiFragment.java:178)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at fragments.VotiFragment.onCreateView(VotiFragment.java:75)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.Fragment.performCreateView(Fragment.java:1700)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.BackStackRecord.run(BackStackRecord.java:684)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.Activity.performStart(Activity.java:5240)
08-31 18:16:54.930: E/AndroidRuntime(2218):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
08-31 18:16:54.930: E/AndroidRuntime(2218):     ... 11 more

该声明,response = httpClient.execute(httpGet, localContext);被 try/catch 块正确包装,但如果抛出异常(例如服务器无法访问、URL 不正确或网络中断的情况),则 catch 块仅打印异常并继续。这意味着后面的语句:

reader = new BufferedReader( new InputStreamReader( response.getEntity().getContent() )

会遇到空指针异常,因为response一片空白。 httpClient.execute 语句的 catch 块应该只是return打印出错误异常后。更好的方法是只使用一组 try catch 块来解析请求和响应。像下面这样:

HttpResponse response = null;
try {
    HttpGet httpGet = new HttpGet(url);
    response = httpClient.execute(httpGet, localContext);
    reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
} catch (IOException ioex) {
    Log.d(TAG, "IOException", ioex);
} catch (IllegalStateException ise) {
    Log.d(TAG, "IllegalStateException", ise);
}

由于日志语句可以打印带有消息的异常,因此我刚刚为您组合了它。您不需要多余的 printStateTrace 语句。由于ClientProtocolException继承自IOException,因此您只需捕获基类即可。

另外,您可以通过在类中声明“TAG”变量来使日志语句更具可过滤性,如下所示:

public static final String TAG = VotiFragment.class.getSimpleName();

现在我已经清理完你的代码了,我刚刚意识到你遇到了另一个问题。 asynctask 的重点是避免在主线程上执行网络 I/O。但是 asynctask 所做的只是启动 HTTP 请求,但实际上并不解析响应。它只是创建阅读器对象,我认为您实际上是从 UI 线程上进行流式传输的。这意味着主线程上的剩余网络 I/O 除非响应已完全缓冲。我建议您在后台任务中进行所有解析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步任务返回空指针 的相关文章

随机推荐