使用 Java 解压密码保护的 zip 文件抛出 NullPointerException
Unzip password protected zip file using Java throws NullPointerException
我需要解压缩受密码保护的 zip 文件。
到目前为止,我是在互联网的帮助下得到这个的,我正在努力理解代码。
但它抛出 nullpointerexception。我真的很困惑。是 "child"
或者是其他东西。请解释一下。
Exception in thread "main" java.lang.NullPointerException at
unzip2.Unzip2.main(Unzip2.java:27)
C:\Users\zxc\AppData\Local\NetBeans\Cache.2\executor-snippets\run.xml:53:
Java returned: 1 BUILD FAILED (total time: 0 seconds)
它说它在第 27 行。
for (final File child : file. listFiles()) {
据我所知,nullpointerexception 意味着我的变量为 null,但我不知道这里的 null 在哪里以及如何修复它
这是我的完整代码。请赐教
/*
* 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");
}
}
}
}
答案在您的 File
实例上方的一行
//Folder where zip file is present
final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");
您需要定义 zip 文件所在的文件夹,而不是 zip 文件本身
final File file = new File("C:/Users/zxc/Desktop/ziptest");
您不需要迭代文件处理程序。只需在创建 ZipFile 对象时传递 file
对象即可。
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");
}
//}
}
简单,看一下javadoc:
public File[] listFiles()
Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.
If this abstract pathname does not denote a directory, then this method returns null.
您提供了一个文件名,并询问其路径。文件没有路径。因此返回 null,并且 for (whatever : null)
导致 NPE。
所以这里的重点是:阅读文档,而不是盲目地写下一些代码而不理解这些代码应该做什么。
我需要解压缩受密码保护的 zip 文件。
到目前为止,我是在互联网的帮助下得到这个的,我正在努力理解代码。
但它抛出 nullpointerexception。我真的很困惑。是 "child" 或者是其他东西。请解释一下。
Exception in thread "main" java.lang.NullPointerException at unzip2.Unzip2.main(Unzip2.java:27) C:\Users\zxc\AppData\Local\NetBeans\Cache.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 0 seconds)
它说它在第 27 行。
for (final File child : file. listFiles()) {
据我所知,nullpointerexception 意味着我的变量为 null,但我不知道这里的 null 在哪里以及如何修复它
这是我的完整代码。请赐教
/*
* 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");
}
}
}
}
答案在您的 File
实例上方的一行
//Folder where zip file is present
final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");
您需要定义 zip 文件所在的文件夹,而不是 zip 文件本身
final File file = new File("C:/Users/zxc/Desktop/ziptest");
您不需要迭代文件处理程序。只需在创建 ZipFile 对象时传递 file
对象即可。
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");
}
//}
}
简单,看一下javadoc:
public File[] listFiles()
Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname. If this abstract pathname does not denote a directory, then this method returns null.
您提供了一个文件名,并询问其路径。文件没有路径。因此返回 null,并且 for (whatever : null)
导致 NPE。
所以这里的重点是:阅读文档,而不是盲目地写下一些代码而不理解这些代码应该做什么。