我正在用java解压一个ZIP文件:
ZipFile zipFile = new ZipFile(theZipFile);
Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
while(zipEntries.hasMoreElements()){
ZipEntry entry = zipEntries.nextElement(); /// <---Nullpointer exception happens here
}
代码执行通过了while(zipEntries.hasMoreElements())
,但提取ZipEntry失败。
奇怪的是,hasMoreElements
返回true,但在试图取出元素时出现空指针。
例外来自JDK lib中的ZipFile类,我在调试器中看不到本地变量,那么如何找出Zip文件的问题所在呢?
编辑:堆栈跟踪:
java.lang.NullPointerException
at java.util.zip.ZipFile.getZipEntry(ZipFile.java:529)
at java.util.zip.ZipFile.access$900(ZipFile.java:56)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:511)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:481)
发布于 2013-02-21 10:56:24
下面是getZipEntry
方法(从1.7.0_10开始):
private ZipEntry getZipEntry(String name, long jzentry) {
ZipEntry e = new ZipEntry();
e.flag = getEntryFlag(jzentry); // get the flag first
if (name != null) {
e.name = name;
} else {
byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME);
if (!zc.isUTF8() && (e.flag & EFS) != 0) {
e.name = zc.toStringUTF8(bname, bname.length);
} else {
e.name = zc.toString(bname, bname.length); // Line 529
}
}
/* snip */
return e;
}
在此行上抛出NullPointerException
的唯一原因是如果e
、zc
或bname
为null
。
e
不能为null
,因为它在此方法中已明确实例化。
zc
不能为null
public ZipFile(File file, int mode, Charset charset) throws IOException
{
/* snip */
this.zc = ZipCoder.get(charset);
/* snip */
}
static ZipCoder get(Charset charset) {
return new ZipCoder(charset);
}
这意味着bname
必须是null
,这将很难调试。getEntryBytes
是一种native
方法:
private static native byte[] getEntryBytes(long jzentry, int type);
这就是我要做的:
getEntryBytes
存在已修复的错误,并向提交错误报告
发布于 2013-03-18 14:06:41
我最近遇到了同样的问题,所以我比较了JDK1.6和1.7相关的邮政编码。
的真正原因是JDK1.6将使用构造函数<>e215>初始化带有jzentry的zipEntry,如下所示:
ZipEntry ze = new ZipEntry(jzentry);
ZipEntry(long jzentry) {
initFields(jzentry);
}
但在JDK1.7中,我们可以看到它使用
private ZipEntry getZipEntry(String name, long jzentry) {
ZipEntry e = new ZipEntry(); // it did not use jzentry initial it
当某些jar文件具有空条目时,它将抛出异常。
https://stackoverflow.com/questions/14993621
复制相似问题