1

我需要解压缩受密码保护的 zip 文件。

到目前为止,我在互联网的帮助下得到了这个,我试图理解代码。

但它会抛出空指针异常。我真的很困惑。是“孩子”还是别的什么。请解释一下。

unzip2.Unzip2.main(Unzip2.java:27) C:\Users\zxc\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53 处的线程“main”java.lang.NullPointerException 中的异常:Java 返回:1 BUILD FAILED(总时间:0 秒)

它说它在第 27 行。

for (final File child : file.listFiles()) {

据我所知,nullpointerexception 意味着我的变量为空,但我不知道这里的空值在哪里以及如何修复它

这是我的完整代码。请赐教。

 /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package unzip2;
    /**
     *
     * @author zxc
     */
    import java.io.File;
    import java.util.List;

    import javax.swing.filechooser.FileNameExtensionFilter;

    import net.lingala.zip4j.core.ZipFile;
    import net.lingala.zip4j.exception.ZipException;
    import net.lingala.zip4j.model.FileHeader;

    public class Unzip2 {

        public static void main(String[] args) {

            final FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter("N/A","zip");
            //Folder where zip file is present
            final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");
            for (final File child : file.listFiles()) {
                try {
                    ZipFile zipFile;
                    zipFile = new ZipFile(child);
                    if (extensionFilter.accept(child)) {
                        if (zipFile.isEncrypted()) {
                            //Your ZIP password
                            zipFile.setPassword("password");
                        }
                        List fileHeaderList = zipFile.getFileHeaders();

                        for (int i = 0; i < fileHeaderList.size(); i++) {
                            FileHeader fileHeader = (FileHeader) fileHeaderList.get(i);
                            //Path where you want to Extract
                            zipFile.extractFile(fileHeader, "C:/Users/zxc/Desktop/zipfile");
                            System.out.println("Extracted");
                        }
                    }
                } catch (ZipException e) {
                    System.out.println("Please Try Again");
                }
            }

        }
    }
4

3 回答 3

1

您不需要迭代 File 处理程序。只需file在创建 ZipFile 对象时传递您的对象。

public class Unzip2 {

public static void main(String[] args) {

    final FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter("N/A","zip");
    //Folder where zip file is present
    final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");
    //for (final File child : file.listFiles()) {
        try {
            ZipFile zipFile;
            zipFile = new ZipFile(file);
            if (extensionFilter.accept(file)) {
                if (zipFile.isEncrypted()) {
                    //Your ZIP password
                    zipFile.setPassword("password");
                }
                List fileHeaderList = zipFile.getFileHeaders();

                for (int i = 0; i < fileHeaderList.size(); i++) {
                    FileHeader fileHeader = (FileHeader) fileHeaderList.get(i);
                    //Path where you want to Extract
                    zipFile.extractFile(fileHeader, "C:/Users/zxc/Desktop/zipfile");
                    System.out.println("Extracted");
                }
            }
        } catch (ZipException e) {
            System.out.println("Please Try Again");
        }
    //}

}
于 2018-05-14T06:07:23.967 回答
1

The answer is a line above your File instantiation

//Folder where zip file is present
final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");

You need to define the folder where your zip file is present, not the zip file itself

final File file = new File("C:/Users/zxc/Desktop/ziptest");
于 2018-05-14T06:05:11.387 回答
1

很简单,让我们看一下javadoc

公共文件[] listFiles()

返回一个抽象路径名数组,表示此抽象路径名表示的目录中的文件。如果此抽象路径名不表示目录,则此方法返回 null。

你给了一个文件名,并询问它的路径。文件没有路径。因此返回 null,并for (whatever : null)导致 NPE。

所以真正的重点是:阅读文档,而不是在不了解代码应该做什么的情况下盲目地放下一些代码。

于 2018-05-14T06:10:41.173 回答