-1

私はこのサイトに不慣れなため、ここでご容赦ください。以下は、Java クラスでのプログラミング用に私が書いたプログラムです。これまでのところ、そのほとんどはうまくいっていますが、特定のバグを取り除くことはできないようです。

プログラムが 3 番目の if ブロック (choice == 3) に到達すると、ユーザーはデータを入力できなくなります。

"outputStream = openOutputTextFile(新しいファイル名);"

if ブロックに存在する場合、FileNotFoundException が発生します。しばらくコードをいじった後、プログラムがinputStreamを見つけることができなくなったため、エラーがスローされていることがわかりました。私がチェックしたところ、プログラムはまだエラーをスローしているファイルを見つけて読み書きできることがわかりました。

エラーは、outputStream を入れたときにのみ発生し、inputStream によってスローされているため、おそらくファイル ストリームと関係があると考えています。私は正確に何を知りません

この問題を解決する方法について誰かアイデアがありますか?

  public class FileProgram {

    public static PrintWriter openOutputTextFile(String fileName)
            throws FileNotFoundException {
        PrintWriter toFile = new PrintWriter(fileName);
        return toFile;
    }

    public static Scanner readFile(String fileName)
    throws FileNotFoundException {
        Scanner inputStream = new Scanner(new File(fileName));
        return inputStream;
    }

    public static void main(String args[]) throws FileNotFoundException {

        ArrayList<String>fileReader = new ArrayList<String>(10);
        PrintWriter outputStream = null;
        Scanner inputStream = null;
        Scanner keyboard = new Scanner(System.in);
try {

            System.out.println("Enter the name of the text file you want to copy.");
            String oldFileName = keyboard.nextLine();
            inputStream = readFile(oldFileName);

            while(inputStream.hasNextLine()) {
                String currentLine = inputStream.nextLine();
                fileReader.add(currentLine);
            }

            System.out.println("All data has been collected. Enter the name for the new text file");
            String newFileName = keyboard.nextLine();
            outputStream = openOutputTextFile(newFileName);
            File userFile = new File(newFileName);

            if(userFile.exists())

            {
                System.out.println("The name you entered matches a file that already exists.");
                System.out.println("Here are your options to fix this issue.");
                System.out.println("Option 1: Shut down the program.");
                System.out.println("Option 2: Overwrite the old file with the new empty one.");
                System.out.println("Option 3: Enter a different name for the new file.");
                System.out.println("Enter the number for the option that you want.");
                int choice = keyboard.nextInt();

                if(choice == 1) {
                    System.exit(0);
                } else if(choice == 2) {
                    outputStream = new PrintWriter(newFileName);
                } **else if(choice == 3) {
                    System.out.println("Enter a different name.");
                    String newerFileName = keyboard.nextLine();
                    outputStream = openOutputTextFile(newerFileName);
                }**

            }
            for(int i = 0; i < fileReader.size(); i++) {
                String currentLine = fileReader.get(i);
                outputStream.println(currentLine);
                //System.out.println(currentLine);
            }
            System.out.println("The old file has been copied line-by-line to the new               file.");


        }
        catch(FileNotFoundException e) {
            System.out.println("File not found");
            System.out.println("Shutting program down.");
            System.exit(0);

        }

        finally {
            outputStream.close();
            inputStream.close();
        }

    }
}
4

1 に答える 1

2

.nextInt() を呼び出した後、Scanner オブジェクトから入力行を取得するのに問題があります。数値の選択に応じて、ユーザーは整数の後に改行を入力します。

この行は、入力バッファーから整数を読み取ります。

int choice = keyboard.nextInt();

ただし、数値の直後の入力バッファーにはまだ改行があります。したがって、.nextLine() を呼び出すと、次のようになります。

String oldFileName = keyboard.nextLine();

空行が表示されます。ファイル名に空の文字列を使用してファイルを作成することはできないため、FileNotFoundException がスローされます (これは仕様によるものです。他の回答を参照してください)。

1 つの解決策は、一貫して .nextLine() を使用し、入力バッファーから一度に 1 行ずつ取得することです。整数が必要な場合は、文字列を手動で解析するだけです。

int choice = Integer.parseInt( keyboard.nextLine() );

ところで、この種の問題をデバッグする際には、何が起こっているかを確認するためにいくつかの出力ステートメントを追加する習慣を身につけることが非常に役立ちます。

public static PrintWriter openOutputTextFile(String fileName)
        throws FileNotFoundException {
    System.out.println( "Trying to create file: '" + fileName + "'" );
    PrintWriter toFile = new PrintWriter(fileName);
    return toFile;
}

より高度なデバッグ手法がありますが、これは非常に単純であり、何も使用しないよりもはるかに効果的です。

于 2013-05-25T09:24:45.420 に答える