1

私は学校向けのプログラムを書こうとしています。割り当ては、ループしてユーザーにファイルの入力を求めることです。ファイルが見つからないか、ユーザーがループを終了すると(私の場合、joptionpaneで[キャンセル]をクリックします)、各ファイルのデータが出力されます。これまでのところ、これは私のコードです:

/**
 * @param args
 */
public static void main(String[] args) {

    // Lists to hold file data
    List<String> fileNames = new ArrayList<String>();
    List<Integer> numChars = new ArrayList<Integer>();
    List<Integer> numWords = new ArrayList<Integer>();
    List<Integer> numLines = new ArrayList<Integer>();
    String inFile;

    while ( (inFile = JOptionPane.showInputDialog("Enter a file name:")) != null) {

        // Create new file object instance
        File file = new File(inFile);

        try {
            fileNames.add(inFile);  // File name as a string
            // Pass file objects
            numChars.add( getNumChars(file));
            numWords.add( getNumWords(file));
            numLines.add( getNumLines(file));
            System.out.println("entered try block");
        } catch(FileNotFoundException e) {
            System.out.println("Could not find file: " + inFile);
            // break out the loop and display data
            break;
        }
    }   // end while

    if (numChars.size() > 0)
        showFileData(fileNames, numChars, numWords, numLines);

    System.out.println("Program ended");

}

private static void showFileData(List<String> fileNames,
        List<Integer> numChars, List<Integer> numWords,
        List<Integer> numLines) {
    for (int i=0;i<numChars.size();i++) {
        System.out.println("Data for: " + fileNames.get(i));
        System.out.println("Number of characters: " + numChars.get(i));
        System.out.println("Number of words: " + numWords.get(i));
        System.out.println("Number of lines: " + numLines.get(i));
        System.out.println("-----------------------------------------------");
    }

}

private static int getNumLines(File file) throws FileNotFoundException {
    int c = 0;
    Scanner f = new Scanner(file);
    while(f.hasNextLine()) {
        c++;
    }
    return c;
}

private static int getNumWords(File file) throws FileNotFoundException {
    int c = 0;
    Scanner f = new Scanner(file);
    while (f.hasNextLine()) {
        String[] w = f.nextLine().split(" ");
        c += w.length;
    }
    return c;
}

private static int getNumChars(File file) throws FileNotFoundException {
    Scanner f = new Scanner(file);
    int c = 0;
    String line;
    while(f.hasNextLine()) {
        line = f.nextLine();
        String[] s = line.split(" ");
        for (int i=0;i<s.length;i++) {
            c += s[i].length();
        }
    }
    return c;
}

プログラムを実行するときにキャンセルを押すと、ループが終了し、想定どおりに最後に表示されます。存在しないファイルを入力すると、想定どおりに機能します。それが機能しないのは、存在するファイルを入力したときだけで、別の入力ダイアログがポップアップしません。実際、tryブロックに入っていないようです。プログラムを正しく設定しましたか?

4

4 に答える 4

5

に無限ループがありgetNumLines()ます。f.nextLine()whileループが必要です。

于 2012-09-12T19:07:55.727 に答える
0

@DomVは正しいです。getNumLines()関数に無限ループがあります。

最終的に、ファイルを開いて3回読み取り、行数を1回取得して単語数を取得し、1回を文字数を取得します。たぶん、これらの高価なディスク操作を最小限に抑える方法を見つけたいと思うでしょう。これを行うと、ファイルを読み取っているときに何をしているのかを詳しく調べて、無限ループを解決する必要があります。

于 2012-09-12T19:10:55.957 に答える
0

このメソッドでは、アプリケーションは永久にループします。

private static int getNumLines(File file) throws FileNotFoundException {
    int c = 0;
    Scanner f = new Scanner(file);
    while(f.hasNextLine()) {
        c++;
    }
    return c;
}

while()ループに注意してください。ファイルに追加の行があるかどうかを確認しますが、ファイルからデータを読み取らないため、hasNextLine()は継続的にtrueを返します。

于 2012-09-12T19:11:10.680 に答える
0

getNumLinesの場合:

 while(f.hasNextLine()) {
  c++;
 }

常に真実になります、のためにそれを変更します

    private static int getNumLines(File file) throws FileNotFoundException {
    int c = 0;
    Scanner f = new Scanner(file);
     while(f.hasNextLine()) {
        f.nextLine();
        c++;
     }
     return c;
    }
于 2012-09-12T19:11:57.307 に答える