如何使用StringTokenizer统计行数、令牌数、整数个数及和并解决Java编译报错
错误原因
- 语法混用错误:不能在自增/累加表达式前加变量类型关键字,
int lineCount++属于非法写法,Java会将这行识别为新变量声明语句,而声明语句不支持接++操作,因此会抛出缺分号的编译错误。 - 作用域配置错误:
lineCount、tokenCount、intCount、intSum这几个计数器变量需要声明在循环逻辑的外层,要是写在while循环内部,不仅每次循环都会重置计数,循环结束后打印结果的代码也无法访问这些变量。 - 大小写错误:Java是大小写敏感的语言,字符串转整数的方法是
Integer.parseInt(),你写成了小写开头的integer.parseInt(),不符合语法规范。 - 笔误与导包错误:导包语句
import java.BufferedReader路径错误,BufferedReader属于java.io包;创建输入流的代码中newjava.io.InputStreamReader少了空格,应为new java.io.InputStreamReader。 - 逻辑漏洞:判断命令行参数为空时仅打印了提示,没有终止程序执行,后续访问
args[0]会直接触发数组越界异常。
修改后可运行代码
import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; public class mcmahon_p1 { public static void main (String[] args) { // 提前在外层声明计数器并初始化 int lineCount = 0; int tokenCount = 0; int intCount = 0; int intSum = 0; if(args.length == 0) { System.out.println("Please enter a command line argument."); // 参数为空直接退出,避免后续逻辑报错 System.exit(0); } try { BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]))); String inn; while( (inn = input.readLine()) != null) { lineCount++; inn = inn.toLowerCase(); StringTokenizer st = new StringTokenizer(inn); while(st.hasMoreTokens()) { tokenCount++; String token = st.nextToken(); try { int v = Integer.parseInt(token); intCount++; intSum +=v; } catch(Exception e) { // 非整数直接跳过 } } } System.out.println(lineCount); System.out.println(tokenCount); System.out.println(intCount); System.out.println(intSum); input.close(); } catch(Exception e) { System.out.println(e.toString()); System.exit(0); } } }
内容的提问来源于stack exchange,提问作者TinkMain
相关产品推荐
相关产品推荐

