Java 如何调试库代码中发生的NullPointerException?
我正在用java提取一个ZIP文件: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
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提交错误报告
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