You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中StringTokenizer提取单行注释异常:含/*的注释无法输出

问题原因分析

我来帮你排查这个问题~你的代码出现空行输出的核心问题,是误解了StringTokenizer的工作逻辑:

StringTokenizer的第二个参数是单个字符组成的分隔符集合,不是完整的字符串分隔符。当你传入"//"作为分隔符时,它会把单个的'/'字符当作分隔符,而不是把"//"整个字符串当作分隔符。

举个具体的例子,当处理行"// /* cdcdf"时:

  • 以'/'为分隔符,StringTokenizer会把该行分割成三个部分:""(第一个/之前的内容)、""(两个/之间的内容)、" /* cdcdf"(第二个/之后的内容)。
  • 因为该行以"//"开头,你的代码直接调用st1.nextToken(),取到的是第一个空字符串,所以输出了空行。
解决方案:改用字符串定位截取

放弃StringTokenizer,改用String.indexOf("//")来精准定位单行注释的起始位置,然后直接截取注释内容,这样能完美处理包含特殊字符的注释。

修正后的代码如下:

package printC;
import java.io.*;

public class PrintComments {
    public static void main(String[] args) {
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader(args[0]));
            while ((line = br.readLine()) != null) {
                int commentStart = line.indexOf("//");
                if (commentStart != -1) {
                    // 截取从//之后到行尾的所有内容
                    String comment = line.substring(commentStart + 2);
                    System.out.println(comment);
                }
            }
            br.close(); // 别忘了关闭流,避免资源泄漏
        } catch (Exception e) {
            e.printStackTrace(); // 输出详细错误栈,方便调试
        }
    }
}
额外优化说明
  • 这个方案能正确处理所有单行注释场景,不管注释里包含/*、空格还是其他特殊字符。
  • 补充了br.close()关闭流操作,避免IO资源泄漏。
  • 把原代码的System.out.println(e)改成e.printStackTrace(),能输出更详细的错误信息,便于调试排查问题。

内容的提问来源于stack exchange,提问作者anna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:22:48