尝试在eclipse中打开txt文件时,我不断收到java.lang.NullPointerException。基本上,这是一个主菜单,当你点击"规则"按钮,规则文本文件应该打开。目前,txt文件位于名为" Resources" (这是我在制作游戏时使用的所有其他img文件的地方)。这是代码:
private List<String> readFile(String filename)
{
List<String> records = new ArrayList<String>();
try
{
BufferedReader buff = new BufferedReader(new InputStreamReader(
Configuration.class.getResourceAsStream(filename)));
String line;
while ((line = buff.readLine()) != null)
{
records.add(line);
}
buff.close();
return records;
}
catch (Exception e)
{
System.err.format("Exception occurred trying to read '%s'.", filename);
e.printStackTrace();
return null;
}
}
//action performed
public void actionPerformed(ActionEvent ae) {
JButton b = (JButton)ae.getSource();
if( b.equals(newGameButton) )
{
flag = true;
controller.startGame();
buttonPressed = "newGameBtn";
}
if(b.equals(quitButton))
{
System.exit(0);
}
if(b.equals(ruleButton)){
readFile("../resource/riskRules.txt");
}
}
感谢帮助!
答案 0 :(得分:1)
如果“资源”它在Eclipse中被标记为资源。构建时,应将txt文件复制到类路径中。 根据我可以从你的代码中猜出你应该做的事情
Configuration.class.getResourceAsStream("riskRules.txt")
由于您的文件位于类路径的根级别。
例如,如果文件在资源中包含名为“text”的目录,则可以使用类似
的内容Configuration.class.getResourceAsStream("text/riskRules.txt")
答案 1 :(得分:0)
在尝试使用getResourceAsStream
之前,需要对getResourceAsStream
返回的结果进行一定程度的基本错误检查。您使用getResource
代替String path = "/path/to/resource"; // note the leading '/' means "search from root of classpath"
URL fileUrl = getClass().getResource(path);
if (fileUrl != null ) {
File f = new File(fileUrl.toURI());
BufferedReader = new BufferedReader(new FileReader(f));
// do stuff here...
}
else {
// file not found...
}
是否有理由?如果文件存在于磁盘上(我从你的OP看到它是因为它在一个包中,并且可能在磁盘上没有物理存在),那么你可以使用它来返回它的路径,并从中创建一个文件对象
String path = "/path/to/resource"; // note the leading '/' means "search from root of classpath"
InputStream is = getClass().getResourceAsStream(path);
if (is != null ) {
BufferedReader = new BufferedReader(new InputStreamReader(is));
// do stuff here...
}
else {
// file not found...
}
如果您需要从JAR存档中提取文件,则可以执行以下操作:
getResource...
如果找不到您的资源,您将避免使用NPE,并且可以正确地解释它缺失的事实。
请注意,如果您的资源包(jar)确实存在,那么就不能使用路径来定位使用“..”的路径,因为jar存档中没有“相对路径”,实际上并不是文件系统上的文件。
您的“资源”位于您在getClass().getResourceAsStream("/com/program/resources/<file.txt>");
方法中指定的相对路径。前导“/”表示查看类路径的根以查找资源。没有前导“/”表示相对于您用于查找资源的类文件的位置。
如果您的文件位于名为“com.program.resources”的位置,并且您尝试从名为“com.program.someotherpackage.MyClass”的类中找到它,那么您将使用:
<classpath root>
com
program
resources
file.txt
img.png
someotherpackage
MyClass.class
找到它。
这是我的例子:
{{1}}
通常,通常的做法是将资源保留在的包结构之外,以避免在以后查找时出现混淆。大多数IDE都有办法将目录标记为资源,因此在编译程序时,它们将被复制到类路径根目录中的适当位置,并且可以由任何要求它们的类找到。