当我在netbeans之外运行这段代码时,我得到一个空指针异常。我正在尝试读取.DAT文件。在netbeans中工作正常。我已多次检查路径,这绝对是正确的。是一个类加载器或类似的东西应该使用?
static String fileName = "src/frogger/highScores.DAT";
try {
//Make fileReader object to read the file
file = new FileReader(new File(fileName));
fileStream = new BufferedReader(file);
} catch (Exception e) {
System.out.println("File not found");
}
我想象用这样的东西用图像,但它不起作用。
file = new FileReader(new File(this.getClass().getResource(fileName)));
或
file = new FileReader(this.getClass().getResource(fileName));
错误
Microsoft Windows [Version 6.1.7601]
版权所有(c)2009 Microsoft Corporation。保留所有权利。
C:\Users\Michael>java -jar "C:\Users\Michael\Documents\NetBeansProjects\Frogger\
dist\Frogger.jar"
File not found
Exception in thread "main" java.lang.NullPointerException
at frogger.Board.readFile(Board.java:519)
at frogger.Board.gameInit(Board.java:154)
at frogger.Board.addNotify(Board.java:111)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at javax.swing.JRootPane.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at java.awt.Window.addNotify(Unknown Source)
at java.awt.Frame.addNotify(Unknown Source)
at java.awt.Window.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at frogger.Window.<init>(Window.java:16)
at frogger.Window.main(Window.java:22)
该文件位于netbeans上的包蛙中。
答案 0 :(得分:0)
如果您的代码已部署,您的代码将引用一个src文件夹,该文件夹应该不再存在。访问资源的正确方法是
// no src/ in the resource name
InputStream is=getClass().getResourceAsStream("/frogger/highScores.DAT");
fileStream = new BufferedReader(new InputStreamReader(file));
您的IDE通常会将资源从src复制到生成的类文件的位置。但是,如果部署应用程序,则必须关心文件是否与其一起打包。
如果frogger与您的类的包名匹配,则可以进行相对查找
InputStream is=getClass().getResourceAsStream("highScores.DAT");
请注意,NullPointerException自然会出现,因为您正在捕获IOException,然后继续进行,因为未初始化的Reader没有发生任何事情。您应该确保在分配失败时不执行处理资源的代码。
但对于像highscores这样的东西,您应该考虑使用Preferences API,它会为您提供独立于应用程序位置的持久存储。