Java 如何调试库代码中发生的NullPointerException?

Java 如何调试库代码中发生的NullPointerException?,java,nullpointerexception,zipfile,Java,Nullpointerexception,Zipfile,我正在用java提取一个ZIP文件: ZipFile zipFile = new ZipFile(theZipFile); Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); while(zipEntries.hasMoreElements()){ ZipEntry entry = zipEntries.nextElement(); /// <---Nullpointer exc

我正在用java提取一个ZIP文件:

ZipFile zipFile = new ZipFile(theZipFile);
  Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
    while(zipEntries.hasMoreElements()){
      ZipEntry entry = zipEntries.nextElement(); /// <---Nullpointer exception happens here
  }

以下是
getZipEntry
方法(从1.7.0开始):

如果
e
zc
bname
null
,则会在此行抛出
NullPointerException

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);
我将这样做:

  • 找出是那个特定的zip文件还是所有的zip文件。如果是特定的zip文件,请尝试重新制作它
  • 更新您的Java版本,可能是
    getEntryBytes
    中存在已修复的错误
  • 向Oracle提交错误报告

我最近也遇到了同样的问题,所以我比较了jdk1.61.7相关的zip源代码

真正的原因是JDK1.6将通过构造函数使用jzentry初始化zipEntry,如下所示:

但是在jdk1.7中,我们可以看到它的使用

private ZipEntry getZipEntry(String name, long jzentry) {
    ZipEntry e = new ZipEntry(); // it did not use jzentry initial it

当一些jar文件有空条目时,它将抛出异常。

请发布堆栈跟踪。此外,在处理文件时是否有可能修改该文件?如果已将调试器附加到该文件,是否检查了zipEntries的值?检查zipEntries上的元素怎么样?@TedHopp堆栈跟踪被添加。不,文件在提取期间未被修改。这是整个堆栈跟踪吗?这里没有关于您的代码的内容。@TedHopp它从我的帖子中的这一行开始
ZipEntry entry=zipEntries.nextElement()
Ok,终于解决了。ZipFile有一个名为emtpy string的条目!感谢杰弗里的详细解释!这最终应该用JDK9()解决。
private static native byte[] getEntryBytes(long jzentry, int type);
ZipEntry ze = new ZipEntry(jzentry);

ZipEntry(long jzentry) {
    initFields(jzentry);
}
private ZipEntry getZipEntry(String name, long jzentry) {
    ZipEntry e = new ZipEntry(); // it did not use jzentry initial it