Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 空指针异步任务返回_Android_Csv_Android Asynctask - Fatal编程技术网

Android 空指针异步任务返回

Android 空指针异步任务返回,android,csv,android-asynctask,Android,Csv,Android Asynctask,我正在尝试使用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

我正在尝试使用
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文件,但我在
BufferedReader(“读取器”)
上得到一个
Nullpointerexception
。处理资产目录中的本地文件没问题。 有人能帮我吗

以下是完整的日志:

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=newbufferedreader(
新的InputStreamReader(
response.getEntity().getContent()
)

由于
响应
为空,将遇到空指针异常。httpClient.execute语句的catch块在打印出错误异常后应仅
返回
。更好的方法是仅使用一组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);
}
由于log语句可以打印带有消息的异常,我刚刚为您组合了它。您不需要reduntant printStateTrace语句。因为ClientProtocolException继承自IOException,所以您只需要捕获基类

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

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

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

这是
readCsv
代码:

public void readCsv()引发IOException{

     String line = "";
     db.beginTransaction();
            try {
                while ((line = reader.readLine()) != null) {
                String[] colums = line.split(",");
                    if (colums.length > 23) {
                        Log.d("CSVParser", "Skipping Bad CSV Row");
                        continue;
                    }

                    Player play1 = new Player(colums[1].trim(), colums[2].trim(), Integer.parseInt(colums[3]), 
                            Integer.parseInt(colums[4]), Integer.parseInt(colums[5]),
                            Double.parseDouble(colums[6]), Double.parseDouble(colums[7]), Integer.parseInt(colums[8]), 
                            Double.parseDouble(colums[9]), Integer.parseInt(colums[10]), 
                            Integer.parseInt(colums[11]), Integer.parseInt(colums[12]));

                    db.addPlayer(play1);

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
       db.setTransactionSuccessful();
       db.beginTransaction();

    }

catch语句中的stacktrace是否正在执行?现在发布完整的log@AntonioFalcone:post
readCsv
方法code@AntonioFalcone-最有可能是因为真正的崩溃发生在VotiFragment.java的第178行。
位于fragments.VotiFragment.readCsv(VotiFragment.java:178)
您的readCsv中的
reader
变量可能为空。您做了哪些调试工作?