2014-08-31 49 views
2

我试图访问使用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 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 ("reader")一个Nullpointerexception。在资产目录中处理本地文件很好。 任何人都可以帮助我吗?

以下是完整的logcat的:

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 
+1

是否有任何在执行您的catch语句的踪迹呢? – AVP 2014-08-31 18:13:08

+0

现在发布完整日志 – slash89mf 2014-08-31 18:18:36

+1

@AntonioFalcone:发布'readCsv'方法代码 – 2014-08-31 18:24:29

回答

2

声明,response = httpClient.execute(httpGet, localContext);是否正确由try/catch块包裹着,但如果抛出一个异常(例如,当服务器无法访问,不正确的URL的情况下,或者网络关闭),那么catch块只是打印异常并且继续在上。这意味着随后的声明:

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

将达到一个空指针异常,因为response为空。打印出错误异常后,您的httpClient.execute语句的catch块应该只是return。更好的方法是请求和响应解析都只有一组try 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); 
} 

由于日志报表可以打印的异常与消息,我刚刚合并为你。您不需要reduntant printStateTrace语句。由于ClientProtocolException从IOException继承,因此您只需要捕获基类。

而且奖金,你可以让你的日志报表更可过滤在你的类声明“TAG”变量,如下所示:

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

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

+0

使用您的代码的同样的问题。 – slash89mf 2014-08-31 20:59:23

+0

@AntonioFalcone - 很可能是因为你真正的崩溃在VotiFragment.java的第178行。 '在fragments.VotiFragment.readCsv(VotiFragment.java:178)' – selbie 2014-08-31 21:01:22

+0

readCsv中的'reader'变量可能为null。你做了什么来调试呢? – selbie 2014-08-31 21:03:57

0

readCsv代码:

公共无效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(); 

    }