2013-01-22 30 views
4

我有這段代碼,它將服務器響應並將其寫入文件。Android - 終結器引發的未捕獲異常

該文件包含json數據。我將響應寫入文件以便順序掃描json,並避免在List中加載大的json數據!

我認爲這種方法引發異常,但我不確定!

public File getData(final String url) throws URISyntaxException, AuthenticationException, IOException, ClientProtocolException, HttpResponseException { 
    final HttpGet getRequest = new HttpGet(new URI(url)); 

    final UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password); 
    getRequest.addHeader(new BasicScheme().authenticate(creds, getRequest)); 
    getRequest.setHeader("Content-Type", "application/json"); 
    final ResponseHandler<byte[]> responseHandler = new ByteArrayResponseHandler(); 
    final byte[] responseBody = mClient.execute(getRequest, responseHandler); 

    final File output = new File(FileConfig.TEMP_PATH + System.currentTimeMillis()+".json"); 
    final FileOutputStream fos = new FileOutputStream(output.getPath()); 

    fos.write(responseBody); 
    fos.close(); 
    return output; 
} 

但我注意到,最近(我不知道爲什麼)我得到這個異常:

01-22 07:45:51.809: E/System(9055): Uncaught exception thrown by finalizer 
01-22 07:45:51.833: E/System(9055): java.io.IOException: close failed: EIO (I/O error) 
01-22 07:45:51.833: E/System(9055):  at libcore.io.IoUtils.close(IoUtils.java:41) 
01-22 07:45:51.833: E/System(9055):  at java.io.FileInputStream.close(FileInputStream.java:121) 
01-22 07:45:51.833: E/System(9055):  at java.io.FileInputStream.finalize(FileInputStream.java:142) 
01-22 07:45:51.833: E/System(9055):  at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:185) 
01-22 07:45:51.833: E/System(9055):  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168) 
01-22 07:45:51.833: E/System(9055):  at java.lang.Thread.run(Thread.java:856) 
01-22 07:45:51.833: E/System(9055): Caused by: libcore.io.ErrnoException: close failed: EIO (I/O error) 
01-22 07:45:51.833: E/System(9055):  at libcore.io.Posix.close(Native Method) 
01-22 07:45:51.833: E/System(9055):  at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75) 
01-22 07:45:51.833: E/System(9055):  at libcore.io.IoUtils.close(IoUtils.java:38) 
01-22 07:45:51.833: E/System(9055):  ... 5 more 
01-22 07:45:51.833: E/System(9055): Uncaught exception thrown by finalizer 
01-22 07:45:51.841: E/System(9055): java.io.IOException: close failed: EIO (I/O error) 
01-22 07:45:51.841: E/System(9055):  at libcore.io.IoUtils.close(IoUtils.java:41) 
01-22 07:45:51.841: E/System(9055):  at java.io.FileInputStream.close(FileInputStream.java:121) 
01-22 07:45:51.841: E/System(9055):  at java.io.FileInputStream.finalize(FileInputStream.java:142) 
01-22 07:45:51.841: E/System(9055):  at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:185) 
01-22 07:45:51.841: E/System(9055):  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168) 
01-22 07:45:51.841: E/System(9055):  at java.lang.Thread.run(Thread.java:856) 
01-22 07:45:51.841: E/System(9055): Caused by: libcore.io.ErrnoException: close failed: EIO (I/O error) 
01-22 07:45:51.841: E/System(9055):  at libcore.io.Posix.close(Native Method) 
01-22 07:45:51.841: E/System(9055):  at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75) 
01-22 07:45:51.841: E/System(9055):  at libcore.io.IoUtils.close(IoUtils.java:38) 
01-22 07:45:51.841: E/System(9055):  ... 5 more 

一切似乎工作,但我只覺此異常。

的targetSdk確定我的應用程序是13

感謝您的任何意見/迴應!

回答

2

更新你的代碼有點像這樣。

public File getData(final String url) throws URISyntaxException, AuthenticationException, IOException, ClientProtocolException, HttpResponseException { 
    FileOutputStream fos = null; 
    File output = null; 

    final HttpGet getRequest = new HttpGet(new URI(url)); 

    final UsernamePasswordCredentials creds = new UsernamePasswordCredentials(
      username, password); 
    getRequest.addHeader(new BasicScheme().authenticate(creds, getRequest)); 
    getRequest.setHeader("Content-Type", "application/json"); 
    final ResponseHandler<byte[]> responseHandler = new ByteArrayResponseHandler(); 
    final byte[] responseBody = mClient 
      .execute(getRequest, responseHandler); 

    try { 
     output = new File(FileConfig.TEMP_PATH + System.currentTimeMillis() 
       + ".json"); 
     fos = new FileOutputStream(output.getPath()); 

     fos.write(responseBody); 

     fos.flush(); 
     fos.close(); 

    } catch (FileNotFoundException e) { 

    } catch (IOException e) { 

    } catch (Exception e) { 

    } finally { 
     if (fos != null) { 
      fos = null; 
     } 
    } 
    return output; 
} 

因爲當你試圖fos.wrire()或fos.close()它可以通過IOException異常,當你調用new FileOutputStream中(output.getPath());它可能通過FileNotFoundException。

+0

我已經添加了類似你的代碼..但即使catch(Exception e)被調用..所以我認爲異常不會在這裏提出..但我怎麼知道異常是在哪裏引發的?該日誌不包含有關我的類/包的信息..麻將... – gipinani

+3

我想我已經解決了..不是我已發佈的代碼片段..但我不關閉JsonParser對象之前刪除文件是附上..非常感謝您的回覆! – gipinani