我试图从用户“输入”文件中对行,单词,字符进行计数 在这个节目计数之后再继续问。
如果文件不存在,则打印在运行期间计算过的所有数据。
代码:
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.");
}
}
}
}
答案 0 :(得分:2)
一些问题(实际上您的代码存在许多问题,但我将解决与您发布的输出直接相关的问题):
首先,catch
块中的内容只有在FileNotFoundException
时才会出现;那是处理和从错误中恢复的。我怀疑你打算在那里放一个finally
块,或者你打算在catch
之后这样做。我建议您在catching and handling exceptions上阅读本教程,该教程直接描述try
,catch
和finally
。
阅读完该教程后,请回到您的代码中;你可能会发现你有一些重组要做。
其次,考虑到上述情况,您看到的输出显示您正在执行catch
块中的代码,这意味着您获得了FileNotFoundException
。这可能是由两件事(可能是显而易见的)中的一件引起的:
找不到您输入的文件。它可能不存在,也可能不在您期望的位置。检查以确保输入正确的文件名并确保文件确实存在。
input
字符串不是您所期望的。也许您从先前的输入中读取了一个空行,等等。
解决原因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
块中的代码。这意味着lines
,words
和chars
的初始值仍然为零(所有修改它们的代码都被跳过)。
希望有所帮助。
答案 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
。我想你可以从这里弄清楚。