首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何调试库代码中出现的NullPointerException?

如何调试库代码中出现的NullPointerException?
EN

Stack Overflow用户
提问于 2013-02-21 10:33:51
回答 2查看 1.8K关注 0票数 4

我正在用java解压一个ZIP文件:

代码语言:javascript
运行
复制
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文件的问题所在呢?

编辑:堆栈跟踪:

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-21 10:56:24

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

代码语言:javascript
运行
复制
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的唯一原因是如果ezcbnamenull

e不能为null,因为它在此方法中已明确实例化。

zc不能为null

代码语言:javascript
运行
复制
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方法:

代码语言:javascript
运行
复制
private static native byte[] getEntryBytes(long jzentry, int type);

这就是我要做的:

  • 会找出是特定的压缩文件还是所有的压缩文件。如果是特定压缩文件,请尝试重新生成它。
  • 更新您的Java版本,可能是getEntryBytes存在已修复的错误,并向

提交错误报告

票数 3
EN

Stack Overflow用户

发布于 2013-03-18 14:06:41

我最近遇到了同样的问题,所以我比较了JDK1.61.7相关的邮政编码

的真正原因是JDK1.6将使用构造函数<>e215>初始化带有jzentry的zipEntry,如下所示:

代码语言:javascript
运行
复制
ZipEntry ze = new ZipEntry(jzentry);

ZipEntry(long jzentry) {
    initFields(jzentry);
}

但在JDK1.7中,我们可以看到它使用

代码语言:javascript
运行
复制
private ZipEntry getZipEntry(String name, long jzentry) {
    ZipEntry e = new ZipEntry(); // it did not use jzentry initial it

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14993621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档