0

このコードを netbeans の外部で実行すると、null ポインター例外が発生します。.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]

Copyright (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 のフロッガー パッケージにあります。

4

1 に答える 1

0

コードがデプロイされている場合、コードはもう存在しないはずの src フォルダーを参照しています。リソースにアクセスする正しい方法は

// no src/ in the resource name
InputStream is=getClass().getResourceAsStream("/frogger/highScores.DAT");
fileStream = new BufferedReader(new InputStreamReader(file));

IDE は通常、リソースを src から生成されたクラス ファイルの場所にコピーします。ただし、アプリケーションをデプロイする場合は、ファイルがパッケージ化されていることに注意する必要があります。

フロッガーがクラスのパッケージ名と一致する場合は、相対ルックアップを実行できます

InputStream is=getClass().getResourceAsStream("highScores.DAT");

NullPointerException は、IOException をキャッチし、初期化されていない Reader で何も起こらなかったので続行しているため、自然に発生することに注意してください。割り当てが失敗したときに、リソースを処理するコードが実行されないようにする必要があります。

ただし、ハイスコアのようなものについては、代わりに、アプリケーションの場所に依存しない永続的なストレージを提供する Preferences API を検討する必要があります。

于 2013-08-28T10:36:53.000 に答える