0

alogrithmのファイル保存に問題があります。

error:
dec 11, 2012 4:56:18 PM tetris.FileIO loadHighscores
SEVERE: null
java.io.FileNotFoundException: file:\C:\Users\Koen\Dropbox\2TI\vgo\Eindwerk\Tetris\build\classes\tetris\LineHighscores.txt (De syntaxis van de bestandsnaam, mapnaam of volumenaam is onjuist)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.util.Scanner.<init>(Scanner.java:656)
    at tetris.FileIO.loadHighscores(FileIO.java:44)
    at tetris.FileIO.getLineScores(FileIO.java:31)
    at tetris.FileIO.main(FileIO.java:69)

Exception in thread "main" java.lang.NullPointerException
    at tetris.FileIO.loadHighscores(FileIO.java:49)
    at tetris.FileIO.getLineScores(FileIO.java:31)
    at tetris.FileIO.main(FileIO.java:69)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

何が悪いのか、これは小さなテトリスゲームの保存アルゴリズムです。

ファイルは以下に保存されます:

... \ Eindwerk \ Tetris \ build \ classes \ tetris \ LineHighscore.txt
... \ Eindwerk \ Tetris \ build \ classes \ tetris \ TimeHighscore.txt

このクラスにメインクラスを追加しました。それをあなたのIDEに貼り付けて実行すると、多くのエラーが発生します

public class FileIO   {
    private File file;
    private Scanner filescScanner, lineScanner;
    private Writer fileWriter, lineWriter;
    private String[][] data;


    public FileIO () {
        String[][] data = new String[100][1];
    }
    public String[][] getLineScores(){
        return this.loadHighscores(this.getClass().getResource("LineHighscores.txt").toString());
    }
    public String[][] getTimeScores(){
        return this.loadHighscores(this.getClass().getResource("TimeHighscores.txt").toString());
    }

    public String[][] loadHighscores(String path){
        int x=0;
        String test = "";
        file = new File(path);

        try {
            filescScanner = new Scanner(file);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(FileIO.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(file.toString());
        while((test=filescScanner.nextLine())!=null) {

            lineScanner = new Scanner(test);
            lineScanner.useDelimiter("-/-");
            System.out.println(lineScanner);
            System.out.println(lineScanner.toString());
            data[x][0]=lineScanner.next();//name    
            data[x][1]=lineScanner.next();//data   
            x++;

        }
        lineScanner.close();
        filescScanner.close();
        return data;

    }


    public static void main(String[] args){
        FileIO file = new FileIO();
        System.out.println(file.getLineScores());


    }
}
4

1 に答える 1

1

問題は、有効なパスを に渡していないことですnew Filethis.getClass().getResource("LineHighscores.txt")URL オブジェクトを返します。次に、URL オブジェクトの文字列表現を取得しています。

ただし、 を呼び出すときnew File(String)、コンストラクターは、file:// URL を含む文字列ではなく、パス名を想定しています。「file:\C:\Users\Koen\Dropbox\2TI\vgo\Eindwerk\Tetris\build\classes\tetris\LineHighscores.txt」は有効な Windows パス名ではないため、例外がスローされます。

これに対処するにはいくつかの方法があります。getResourceAsStreamの代わりに使用するのが簡単な方法ですgetResource().toString()。次に変更

public String[][] loadHighscores(String path){
    int x=0;
    String test = "";
    file = new File(path);

    try {
        filescScanner = new Scanner(file);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileIO.class.getName()).log(Level.SEVERE, null, ex);
    }

public String[][] loadHighscores(InputStream resourceStream){
    int x=0;
    String test = "";

    filescScanner = new Scanner(resourceStream);

これにより、入力ファイルから直接読み取ることができます。またloadHighScores、データが実際のファイルから来ているか、別の場所から来ているかは気にしません。これは、クラスパス上の jar ファイル内のリソースから読み取る必要がある場合に便利です。ファイルとして直接読み取ることはできませんが、getResourceAsStream を使用するとコンテンツを取得できます。

于 2012-12-11T22:34:59.717 に答える