gpt4 book ai didi

java - 可以捕获 java.util.zip.ZipError 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:46:25 26 4
gpt4 key购买 nike

为什么会抛出 java.util.zip.ZipError,是否可以捕获它?

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

编辑:

查看 java.util.zip 源代码表明,当试图访问文件中不存在的元素时抛出它,但是 java.util.zip.ZipFile类的内部计数表明该元素应该存在。如果另一个线程在 ensureOpen 方法对此进行检查后尝试关闭文件,或者 java.util.zip.ZipFile。如果在 Java 应用程序打开文件时文件被更改,这看起来可能会发生。我真的不明白所涉及的代码库的完整性(它很大!)。

最佳答案

看来 JDK 问题 JDK-4615343提示在 Java 6 中创建 ZipErrorA comment on the issue揭示了 ZipError 的存在:

Instead of throwing an InternalError, the zip file implementation now throws java.util.zip.ZipError.

The new exception is controversial and extends InternalError. In general, this not recommended pratice but was needed for compatibility. Existing programs may have worked around this problem by catching InternalError. Such programs will continue to work but we recommend that all clients are updated to catch java.util.zip.ZipError instead.

这表明 ZipError 是一个已知的错误设计,它的存在仅仅是为了向后兼容。

查看 Java 8 源代码同样确认 ZipError 仅由 ZipFile 迭代方法抛出:entries()stream() .

查看 Java 9 源代码可以发现 Java 9 更进一步,不再抛出 ZipError

至于为什么会被抛出,TestZipError.java OpenJDK 8 中的源代码展示了这样一种情况。如果创建了 ZipFile 对象,然后删除文件系统中的 zip 文件并使用不同的条目创建它,然后遍历 ZipFile 的内容。

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

关于java - 可以捕获 java.util.zip.ZipError 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com