使用带有提示和用户输入的扫描仪

时间:2013-08-17 11:55:22

标签: java input java.util.scanner

我试图从用户“输入”文件中对行,单词,字符进行计数 在这个节目计数之后再继续问。

如果文件不存在,则打印在运行期间计算过的所有数据。

代码:

public class KeepAskingApp {
    private static int lines;
    private static int words;
    private static int chars;

public static void main(String[] args) {
    boolean done = false;
    //counters
    int charsCount = 0, wordsCount = 0, linesCount = 0;
    Scanner in = null;  
    Scanner scanner = null;
    while (!done) {
        try {
            in = new Scanner(System.in);
            System.out.print("Enter a (next) file name: ");
            String input = in.nextLine();

            scanner = new Scanner(new File(input));     
            while(scanner.hasNextLine()) {
                lines += linesCount++;
                Scanner lineScanner = new Scanner(scanner.nextLine());
                lineScanner.useDelimiter(" ");
                while(lineScanner.hasNext()) {
                    words += wordsCount++;
                    chars += charsCount += lineScanner.next().length();
                }
                System.out.printf("# of chars: %d\n# of words: %d\n# of lines: ", 
                        charsCount, wordsCount, charsCount);

                lineScanner.close();
            }

            scanner.close();
            in.close();
        } catch (FileNotFoundException e) {
            System.out.printf("All lines: %d\nAll words: %d\nAll chars: %d\n", 
                    lines, words, chars);
            System.out.println("The end");
            done = true;
        } 
    }
}

}

但我无法理解为什么它总是显示没有参数的输出:

All lines: 0
All words: 0
All chars: 0
The end

为什么省略所有内部部分。
它可能是因为我使用的扫描仪很少,但看起来都很好。 有什么建议吗?

更新

感谢所有给出一些暗示的人。我用新信息重新思考所有构造和重写代码 为了解决棘手的扫描仪输入行,我使用了JFileChooser

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JFileChooser;

public class KeepAskingApp {
    private static int lines;
    private static int words;
    private static int chars;

    public static void main(String[] args) {
        boolean done = false;
        // counters
        int charsCount = 0, wordsCount = 0, linesCount = 0;
        Scanner in = null;
        Scanner lineScanner = null;
        File selectedFile = null;
        while (!done) {
            try {
                try {
                    JFileChooser chooser = new JFileChooser();

                    if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                        selectedFile = chooser.getSelectedFile();
                        in = new Scanner(selectedFile);
                    }
                    while (in.hasNextLine()) {
                        linesCount++;
                        lineScanner = new Scanner(in.nextLine());
                        lineScanner.useDelimiter(" ");
                        while (lineScanner.hasNext()) {
                            wordsCount++;
                            charsCount += lineScanner.next().length();
                        }

                    }
                    System.out.printf(
                            "# of chars: %d\n# of words: %d\n# of lines: %d\n",
                            charsCount, wordsCount, linesCount);

                    lineScanner.close();
                    lines += linesCount;
                    words += wordsCount;
                    chars += charsCount;

                    in.close();
                } finally {
                    System.out.printf(
                            "\nAll lines: %d\nAll words: %d\nAll chars: %d\n",
                            lines, words, chars);
                    System.out.println("The end");
                    done = true;
                }
            } catch (FileNotFoundException e) {
                System.out.println("Error! File not found.");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

一些问题(实际上您的代码存在许多问题,但我将解决与您发布的输出直接相关的问题):

首先,catch块中的内容只有在FileNotFoundException时才会出现;那是处理和从错误中恢复的。我怀疑你打算在那里放一个finally块,或者你打算在catch之后这样做。我建议您在catching and handling exceptions上阅读本教程,该教程直接描述trycatchfinally

阅读完该教程后,请回到您的代码中;你可能会发现你有一些重组要做。

其次,考虑到上述情况,您看到的输出显示您正在执行catch块中的代码,这意味着您获得了FileNotFoundException。这可能是由两件事(可能是显而易见的)中的一件引起的:

  1. 找不到您输入的文件。它可能不存在,也可能不在您期望的位置。检查以确保输入正确的文件名并确保文件确实存在。

  2. input字符串不是您所期望的。也许您从先前的输入中读取了一个空行,等等。

  3. 解决原因2:如果由于某种原因输入缓冲区中已有换行符,您将读取带有Scanner的空白行。您可能希望在打开文件之前打印input的值,以确保它符合您的预期。

    如果您看到空白行,请跳过它们。所以,而不是:

    String input = in.nextLine();
    scanner = new Scanner(new File(input));     
    

    这样的事情将不受空白线的影响:

    String input;
    do {
        input = in.nextLine().trim(); // remove stray leading/trailing whitespace
    } while (input.isEmpty()); // keep asking for input if a blank line is read
    scanner = new Scanner(new File(input));
    

    最后,我认为你可以找出你输出中看到0的原因。当您尝试使用new Scanner(new File(input));打开文件并且由于找不到文件而失败时,它会抛出异常并且程序会立即跳转到catch块中的代码。这意味着lineswordschars的初始值仍然为零(所有修改它们的代码都被跳过)。

    希望有所帮助。

答案 1 :(得分:1)

您的println()位于catch区块

    } catch (FileNotFoundException e) {
        System.out.printf("All lines: %d\nAll words: %d\nAll chars: %d\n", 
                lines, words, chars);
        System.out.println("The end");
        done = true;
    }

这意味着您抓住了FileNotFoundException。我想你可以从这里弄清楚。