java如何调试库代码中发生的NullPointerException?
我正在用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,但在尝试取出元素时会出现null指针
异常来自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)
# 1 楼答案
我最近也遇到了同样的问题,所以我比较了JDK1.6和1.7相关的zip源代码
真正的原因是JDK1.6将由构造函数以jzentry开头,如下所示:
但是在jdk1.7中,我们可以看到它的使用
当一些jar文件有空条目时,它将抛出异常强>
# 2 楼答案
以下是
getZipEntry
方法(从1.7.0_10开始):在这行上抛出
NullPointerException
的唯一原因是e
、zc
或bname
是null
e
不能是null
,因为它在该方法中被明确实例化zc
不能是null
:这意味着}方法:
bname
必须是null
,这将很难调试getEntryBytes
是一种{我将这样做:
getEntryBytes
的bug已经修复