2016-08-02 100 views
0

代碼在IDE上運行良好,但每當我將其實現到應用程序(Android)時,它都會給我一個EOFException如何解決EOFException?

這是代碼:

try { 
    URL url = new URL(link); 

    URLConnection con = url.openConnection(); 
    BufferedReader bf = new BufferedReader(new InputStreamReader(con.getInputStream())); 

    StringBuilder sb = new StringBuilder(); 
    String inputLine; 

    while ((inputLine = bf.readLine()) != null) { 
    sb.append(inputLine); 
    } 

    bf.close(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

這是堆棧跟蹤

java.io.EOFException 
W/System.err:  at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:95) 
W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:179) 
W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101) 
W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:409) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:353) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:220) 
W/System.err:  at com.example.unknown.api_testing.MainActivity$1.doInBackground(MainActivity.java:45) 
W/System.err:  at com.example.unknown.api_testing.MainActivity$1.doInBackground(MainActivity.java:35) 
W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
W/System.err:  at java.lang.Thread.run(Thread.java:818) 
+1

您能和我們分享一下實際的鏈接嗎? –

+0

服務器沒有發送響應:相反,它只是關閉連接。除非您使用的是錯誤的URL,否則這不是您可以在此處「修復」的內容。在瀏覽器中試用。 – EJP

+0

你能分享完整的代碼嗎? –

回答

-3

線之後: 的URLConnection CON = url.openConnection();

將此行放在orger中以避免接收gzip響應。

 con.setRequestProperty("Accept-Encoding", "identity"); // no gzip 
-1

這可能是由於您的設備上的連接。您是使用WiFi還是3G連接?

您的設備可能會丟失連接或丟棄某些數據包。運行QOS測試可能是值得的,以確保連接運行良好。

看一看一個應用程序,如:https://play.google.com/store/apps/details?id=com.nperf.tester&hl=en_GB

您可能還需要檢查連接是否正確返回一個HTTP結束,而不是後,拋出一個錯誤。輸出每個inputLine到您的控制檯,同時處理它來檢查任何異常。

如果引發異常,您可能還想調整您的try catch塊以正確關閉閱讀器。例如:catch IOException而不是Exception,因爲這樣可以讓您處理這些案例更清潔,因爲您可能想要處理IOExceptions與其他Exceptions不同。

try 
{ 
    URL url = new URL(link); 

    URLConnection con = url.openConnection(); 
    BufferedReader bf = new BufferedReader(new InputStreamReader(con.getInputStream())); 

    StringBuilder sb = new StringBuilder(); 
    String inputLine; 

    while ((inputLine = bf.readLine()) != null) 
    { 
     sb.append(inputLine); 
    } 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
finally 
{ 
    //close your reader here 
    bf.close(); 
} 
+0

在Wi-Fi和互聯網連接上運行順暢,它似乎只是每當我在IntelliJ上運行它時,它都會獲取HTML。如果我嘗試使用手機上的代碼,那是我收到此錯誤的唯一時間:(如果我使用其他鏈接,它可以在我的手機上正常工作 –

+0

不,它不是由於本地設備本地設備已收到TCP FIN,* ergo *正在正常工作 – EJP

+0

@EJP - 您如何知道本地設備接收到TCP FIN並且一切正常? –