【发布时间】:2023-03-26 23:40:01
【问题描述】:
我尝试为 Java 课程编写一个小型解析器:解析器使用 Scanner 类:
import java.util.Scanner;
import java.io.*;
public class WC1 {
public static void main(String[] args) throws Exception{
File f = new File(args[0]);
Scanner in = new Scanner(f);
int c=0, w=0, l=0;
while (in.hasNext()) {
String line = in.nextLine();
int N = line.length();
boolean word = false;
for (int i=0;i<N;i++) {
char ch = line.charAt(i);
if (ch == '\r' || ch=='\n') {
if (word == true) w++;
word = false; // do nothing
}
else if (ch == ' ' || ch == '\t') {
if (word == true) w++;
word = false;
c++;
}
else {
word = true;
c++;
}
}
if (word == true) w++;
word = false; // scanner consumes newline but does not return it
c++; // scanner throws away the newline
l++;
System.out.println(line);
}
in.close();
System.out.println("" + c + " characters");
System.out.println("" + w + " words");
System.out.println("" + l + " lines");
}
}
文件1:
我用下面的三个小输入文件对其进行了测试:
异常的原因是你在使用一次扫描器后调用了keyIn.close(),这不仅关闭了Scanner,还关闭了System.in。在下一次迭代中,您将创建一个新的 Scanner,但由于 System.in 现在已关闭,它会立即爆炸。要解决这个问题,您应该只在进入 while 循环之前创建一次扫描程序,并完全跳过 close() 调用,因为您不想关闭 System.in。
修复该问题后,由于您进行了 == 和 != 字符串比较,该程序仍然无法运行。在 Java 中比较字符串时,您必须使用 equals() 来比较字符串内容。当您使用 == 和 != 时,您正在比较对象引用,因此这些比较将始终在您的代码中返回 false。始终使用 equals() 来比较字符串。
java MyClass File1.dat
779 characters
136 words
3 lines
wc File1.dat
3 136 779 test.dat
文件2:
cat
dog
goose chicken
rat
dragon
crab
java MyClass File2.dat
47 characters
7 words
7 lines
wc File2.dat
7 7 47 File2.dat
但这不起作用:
文件3:
|
|
|
|
|
|
|
|
java MyClass File3.dat
0 characters
0 words
0 lines
wc File3.dat
8 0 36 File3.dat
文件 3 仅由空格和换行符组成:管道符号表示行尾。
这里发生了什么?注意 File2 中的空行。为什么 Scanner 似乎忽略了 File3 中的空格?
【问题讨论】:
-
会读这篇文章的人。你能给出一个摘要或jist你的问题是什么吗?
-
只是想知道:在“文件 1:”下,您是否故意混淆?该文本是您的测试文件的全部部分,与您的问题没有特别相关性,还是其中的某些部分也用于描述您的问题?
标签: java