build jar上的file.listFiles()NullPointerException

时间:2019-03-13 19:13:08

标签: java

当我在Intellij Idea上运行代码时,它可以正常运行,但是当我在.jar(这样构建)上运行代码时,会出现NullPointerException。有人知道为什么以及如何解决这个问题吗?

File folder = new 
File(Main.class.getClassLoader().getResource("assets/maps/").getPath());
System.out.println(folder);
System.out.println(folder.listFiles());
for (File file : folder.listFiles()) {
    if(file.getName().endsWith(".btdm"))
    maps.add(getMap(file));
}

控制台:

file:\E:\Programmation\BabyTD\out\artifacts\BabyTD_jar\BabyTD.jar!\assets\maps
null
Exception in thread "main" java.lang.NullPointerException
at fr.picearth.Main.getMaps(Main.java:51)
at fr.picearth.Main.main(Main.java:26)

2 个答案:

答案 0 :(得分:1)

如果folder不是文件夹或由于某种原因而无法访问(包括java.io.File无法打开jar或其他zip文件(如普通文件夹)的事实),则listFiles()将返回空值。您已经在打印输出中看到了这一点。您必须在进行迭代之前进行检查:

File[] files = folder.listFiles();
if (files != null)
    for (File file : files)
        if(file.getName().endsWith(".btdm"))
            maps.add(getMap(file));

但是,您可能想改为使用java.util.zip.ZipFile

答案 1 :(得分:0)

假设$ip = $query['ip']; $pattern = '/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'; if(preg_match($pattern , $ip) == true) { $exec_cmd = "/usr/bin/sudo -u apache /sbin/iptables -A INPUT -s $ip -j ACCEPT 2>&1"; echo('exec: ' . $exec_cmd); $output = []; $retval = 0; exec($exec_cmd, $output, $retval); print_r($output); echo($retval); } else { echo('Bad IP'); } 文件夹是jar文件的一部分,那么您将无法像驱动器上的其他任何文件夹一样进行访问。 IDE将其视为驱动器上的文件夹/文件,因此可以与assets/maps/一起使用。

您可以做的是在目录路径中使用getResourceAsStream()方法,并且输入Stream将具有该目录中的所有文件名。

尝试用getResource代替getResourceAsStream

getResource

编辑2:

如果您使用的是Java 7+,则也可以使用

String respath = "/path_to_file";

InputStream in = sample2.class.getResourceAsStream(respath);

if ( in == null ){

    throw new Exception("resource not found: " + respath);
}

InputStreamReader inr = new InputStreamReader(in, "UTF-8");

int len;

char cbuf[] = new char[2048];

while ((len = inr.read(cbuf, 0, cbuf.length)) != -1) {
    // do something with cbuf
}