【问题标题】:Is it okay to catch java.util.zip.ZipError?可以捕获 java.util.zip.ZipError 吗?
【发布时间】:2013-12-12 06:03:38
【问题描述】:

java.util.zip.ZipError为什么会被抛出,能抓到吗?

javadoc 说这意味着发生了不可恢复的错误 - 但这样的错误会是什么?我听说它可能是由错误的 zip 文件引起的。

编辑:

查看 java.util.zip 源代码表明,当尝试访问文件中不存在的元素时会抛出它,但 java.util.zip.ZipFile 类的内部计数表明该元素应该存在。如果另一个线程在ensureOpen 方法检查后试图关闭文件,或者java.util.zip.ZipFile 调用的本机方法出现问题,则会发生这种情况。如果在 Java 应用程序打开文件时更改了文件,这看起来可能会发生。我并不真正了解所涉及的代码库的全部内容(它很大!)。

【问题讨论】:

  • 你为什么不抓住它?
  • @redFIVE 因为这是错误而不是异常。
  • @Frankpi 好的,谢谢!

标签: java exception error-handling zip


【解决方案1】:

似乎 JDK 问题 JDK-4615343 促使在 Java 6 中创建 ZipErrorA comment on the issue 揭示了 ZipError 的存在:

现在执行 zip 文件,而不是引发 InternalError 抛出 java.util.zip.ZipError。

新的异常是有争议的并且扩展了 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 的内容。

这些细节提供了强有力的证据,表明 — 与大多数 Errors 不同 — 实际上,捕获抛出的 ZipError 并将其处理为正常的非Error 异常是合理的。尽管如果代码仅在 Java 9+ 上运行,则可能根本不想打扰检查,因为对于不可能的情况,这将是多余的代码。

【讨论】:

【解决方案2】:

ZipError 表示低级 JVM 错误,尽管您可能会像任何其他异常一样捕获它,但整个 JVM 有可能在此时处于不应继续运行的状态.请注意,对于更常见的错误,如损坏的文件、I/O 错误等,有一个单独的ZipException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2019-08-25
    • 2015-09-28
    相关资源
    最近更新 更多