我知道同样的问题被问过很多次,但是经过所有已经发布的答案,我找不到解决方案.
首先,这是我在我的项目中遇到它后用来测试问题的代码:
InputStream test;
System.out.println(this.getClass());
System.out.println(("classpath is: " + System.getProperty("java.class.path")));
test = getClass().getResourceAsStream("/pairs/images/100/back/back1.png");
if (test == null)
{
System.out.println("getClass().getResourceAsStream(\"/pairs/images/100/back/back1.png\") is null");
test = GridPanel.class.getClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}
if (test == null)
{
System.out.println("GridPanel.class.getClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
test = ClassLoader.getSystemClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}
if (test == null)
{
System.out.println("ClassLoader.getSystemClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
Thread.currentThread().getContextClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}
if (test == null)
System.out.println("Thread.currentThread().getContextClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
Run Code Online (Sandbox Code Playgroud)
因此,根据标题,这些对getResourceAsStream()的调用都会返回null,但只有在执行jar文件时,当在IDE(Netbeans 8.0.2)中启动时,它们都返回正确的流(单独测试不使用这段代码)我可以用它.
jar文件内容如下:

netbeans项目文件夹中的src文件夹如下:

所以我现在真的很困惑,我在尝试使用netbeans时尝试使用默认设置,但是我对这个问题感到很失望.
任何提示或想法将不胜感激!
TL;DR 这是由于 NTFS 权限出现一些愚蠢的问题,移动 jar 使其工作
所以我现在觉得自己很傻...
我尝试在 Linux 环境中运行它,一切都按预期运行。这些调用中的每一个都返回一个指向该资源的非空 InputStream。
所以我做了一些非常简单的事情:只是在 Windows 中移动编译好的 jar,检查它是否与 NTFS 权限有关(请记住,我使用的是管理员帐户,我可以在这些文件夹中自由写入、读取和执行) )。将其移动到项目的根目录不起作用,但将其移动到桌面上有效。
更令我惊讶的是,在我正在做的项目的其他一些部分
URL jarUrl = PairsDeck.class.getProtectionDomain().getCodeSource().getLocation();
Run Code Online (Sandbox Code Playgroud)
读取 jar 文件的全部内容,即使在旧目录中,它每次都有效,所以这就是为什么我从一开始就没有想到拧紧权限(并且我是从具有管理员权限的命令提示符启动它)。
所以我猜想程序可以通过该调用读取它的 jar,但由于 NTFS 权限的一些问题而无法从我的 netbeans 项目文件夹中加载资源。
添加一些混乱
File file = new File(jarUrl.toURI());
file.canWrite();
file.canRead();
file.canExecute();
Run Code Online (Sandbox Code Playgroud)
以上所有返回 true。
我只是想知道是否有一种方法可以更好地理解这个问题,并且也许有一种方法可以从 java 代码中发出一些权限错误的信号。
衷心感谢所有参与人员的帮助!