簡體   English   中英

是否可以捕獲java.util.zip.ZipError?

[英]Is it okay to catch java.util.zip.ZipError?

為什么拋出java.util.zip.ZipError ,是否可以捕獲它?

javadoc表示這意味着發生了不可恢復的錯誤 - 但這樣的錯誤是什么? 我聽說它可能來自糟糕的zip文件。

編輯:

查看java.util.zip源表明,當嘗試訪問文件中不存在的元素時會拋出它,但java.util.zip.ZipFile類的內部計數表明該元素應該存在。 如果另一個線程在ensureOpen檢查了ensureOpen方法之后嘗試關閉文件,或者在java.util.zip.ZipFile調用的本機方法中出現問題,則會發生這種情況。 如果在Java應用程序打開文件時更改了文件,就會發生這種情況。 我並不真正理解所涉及的代碼庫的完整性(它很大!)。

似乎JDK問題JDK-4615343在Java 6中提示創建ZipError 。對該問題的評論揭示了ZipError的存在:

zip文件實現現在拋出java.util.zip.ZipError,而不是拋出InternalError。

新的例外是有爭議的,並擴展了InternalError。 一般來說,這不是推薦的實踐,但需要兼容性。 現有的程序可能通過捕獲InternalError解決了這個問題。 此類程序將繼續工作,但我們建議更新所有客戶端以捕獲java.util.zip.ZipError。

這表明ZipError是一種已知的錯誤設計,僅出於向后兼容性原因而存在。

查看Java 8源代碼同樣確認ZipError僅由ZipFile迭代方法拋出: entries()stream()

查看Java 9源代碼可以看出Java 9更進了一步,而且根本不再拋出ZipError

至於為什么會拋出它,OpenJDK 8中的TestZipError.java源代碼顯示了一個這樣的場景。 如果創建ZipFile對象,則會在Microsoft Windows中拋出ZipError ,然后刪除文件系統中的zip文件並使用不同的條目創建它,然后遍歷ZipFile的內容。

這些細節提供了強有力的證據 - 與大多數Error s不同 - 事實上捕獲拋出的ZipError並處理它就好像是正常的非Error異常一樣合理。 雖然如果代碼只能在Java 9+上運行,但可能根本不想打擾檢查,因為對於不可能的情況來說這將是多余的代碼。

ZipError指示一個低級別的JVM錯誤,盡管你可能像任何其他異常一樣捕獲它,但整個JVM有可能處於這樣一個不應該繼續運行的狀態。 請注意,對於更常規的錯誤類型,存在單獨的ZipException ,例如損壞的文件,I / O錯誤等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM