当我在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)
答案 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
}