计算java中的注释数

计算java中的注释数,java,cloc,Java,Cloc,我正在开发一个工具来分析和统计其他人的源代码,这个工具将能够识别代码中的许多东西!现在我一直在计算代码上的注释数,我当前的代码是: public static void main(String[] args) { String line = ""; int count = 0; try { BufferedReader br = new BufferedReader(new FileReader("comments.txt")); wh

我正在开发一个工具来分析和统计其他人的源代码,这个工具将能够识别代码中的许多东西!现在我一直在计算代码上的注释数,我当前的代码是:

 public static void main(String[] args) {

    String line = "";
    int count = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
        while ((line = br.readLine()) != null) {
            if (line.startsWith("//")) {
                count++;
            } else if (line.startsWith("/*")) {
                count++;
                while (!(line = br.readLine()).endsWith("'*\'")) {
                    count++;
                    break;
                }
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println("count=" + count);
}
为了检查代码,我使用了一个测试文件。但是代码在两个文件中都给出了错误的结果,例如;我在下面的文件中得到三个

Yes
//comment
yes
yes
/*
if
random
test
test
*/
而答案应该是两条评论

在下面的文件中,它向我展示了我有五条评论,而实际上我还有两条

Yes
//comment
yes
yes
/*
if
random
test
test
/*
*/

我还没有测试您的代码,但是,我相信这应该是可行的:

public static void main(String[] args) {

    String line = "";
    int count = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
        while ((line = br.readLine()) != null) {
            if (line.startsWith("//")) {
                count++;
            } else if (line.startsWith("/*")) {
                count++;
                while ((line = br.readLine())!=null && !line.endsWith("'*\'"));
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println("count=" + count);
}

当您遇到
/*
时,您应该增加计数器并跳过注释部分。

我还没有测试您的代码,但是,我相信这应该可以:

public static void main(String[] args) {

    String line = "";
    int count = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
        while ((line = br.readLine()) != null) {
            if (line.startsWith("//")) {
                count++;
            } else if (line.startsWith("/*")) {
                count++;
                while ((line = br.readLine())!=null && !line.endsWith("'*\'"));
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println("count=" + count);
}

当您遇到
/*
时,您应该增加计数器并跳过注释部分。

我认为您有一个问题,注释也可能出现在行内或行尾

public static void main(String[] args) {

    String line = "";
    int count = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
        while ((line = br.readLine()) != null) {
            if (line.contains("//")) {
                count++;
            } else if (line.contains("/*")) {
                count++;
                while (!line.contains("*/") && !(line = br.readLine()).contains("*/"));
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println("count=" + count);
}

当然,这里的问题是,如果“/”、“/*”或“*/”序列出现在引用的文本中,该怎么办?

我认为您有一个问题,即注释也可能出现在行内或行尾

public static void main(String[] args) {

    String line = "";
    int count = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
        while ((line = br.readLine()) != null) {
            if (line.contains("//")) {
                count++;
            } else if (line.contains("/*")) {
                count++;
                while (!line.contains("*/") && !(line = br.readLine()).contains("*/"));
            }
        }
        br.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println("count=" + count);
}

当然,这里的问题是,如果“//”、“/*”或“*/”序列出现在引用的文本中,该怎么办?

整个方法是有缺陷的。您需要正确地解析源文件,至少需要正确地跟踪“/*”的引号和嵌套。请注意,任何注释字符组合都可以出现在以下语句中:

 System.out.println("// this is *not* a line comment");
 String s = "*/ this is not the end of a block comment";
等等。然后是一种奇怪的行为,在解释文件之前,正在处理字符转义序列:

    \u002F* this is a valid comment */

确定什么是注释,什么不是注释并不是那么容易:)我强烈建议您为java源代码寻找一个开源解析器解决方案。

整个方法都有缺陷。您需要正确地解析源文件,至少需要正确地跟踪“/*”的引号和嵌套。请注意,任何注释字符组合都可以出现在以下语句中:

 System.out.println("// this is *not* a line comment");
 String s = "*/ this is not the end of a block comment";
等等。然后是一种奇怪的行为,在解释文件之前,正在处理字符转义序列:

    \u002F* this is a valid comment */

确定什么是注释,什么不是注释并不是那么容易:)我强烈建议您为java源代码寻找一个开源解析器解决方案。

伙计们,这是一个简单的解决方案。只需从这个windows平台下载cloc软件。 该软件支持各种语言,也可以接受文件夹中的文件。将文件夹和cloc放在同一位置,然后打开cmd并键入此命令

cloc-(version no).exe (folder name)
cloc-1.64.exe main
代码中有行数、空行数和总行数


有关更多详细信息,请参见:

伙计们,这是一个简单的解决方案。只需从这个windows平台下载cloc软件。 该软件支持各种语言,也可以接受文件夹中的文件。将文件夹和cloc放在同一位置,然后打开cmd并键入此命令

cloc-(version no).exe (folder name)
cloc-1.64.exe main
代码中有行数、空行数和总行数



有关更多详细信息,请参见:

不是答案,而是相关的:看一看,您的代码不计算注释的数量,而是(尝试计算)注释行的数量。
“*\”
应该是
“*/”
。此外,在内部循环中,不检查空行。最好坚持使用1循环,并设置一个布尔值,以指示您是否在多行
/**/注释.BTW注释可以出现在一行中的任何位置。事实上,你可以在一行上有多条评论。@PeterLawrey怎么说?这不算单行吗?@user5923402
int/*这是一个int*/x=/*默认值*/3//初始化
是有效的Java代码。不是答案,而是相关的:看一看,您的代码不会计算注释的数量,而是(尝试计算)注释行的数量。
“*\”
应该是
“*/”
。此外,在内部循环中,不检查空行。最好坚持使用1循环,并设置一个布尔值,以指示您是否在多行
/**/注释.BTW注释可以出现在一行中的任何位置。事实上,你可以在一行上有多条评论。@PeterLawrey怎么说?这不算单行吗?@user5923402
int/*这是一个int*/x=/*默认值*/3//初始化
是有效的Java代码。感谢您的回答,我非常感谢!但答案是给出了一个错误:线程“main”java.lang.NullPointerException中的异常位于countcomment.countcomment.main(countcomment.java:33)java结果:1位于:while(!(line=br.readLine()).endsWith(“*\”);对于前两个文件,它是有效的,但只是文件中的一个小编辑,比如:Yes//comment Yes/*if random test test*/test/**/它仍然给你带来了2我的意图是向你展示代码中的错误,如果你想要一个能处理我认为你仍然得到的所有情况的代码,还有很多案子要处理。谢谢你的回答,我真的很感激!但答案是给出了一个错误:线程“main”java.lang.NullPointerException中的异常位于countcomment.countcomment.main(countcomment.java:33)java结果:1位于:while(!(line=br.readLine()).endsWith(“*\”);对于前两个文件,它是有效的,但只是文件中的一个小编辑,比如:Yes//comment Yes/*if random test test*/test/**/它仍然给你带来了2我的意图是向你展示代码中的错误,如果你想要一个能处理我认为你仍然得到的所有情况的代码,需要管理的案例更多。您的程序将显示您的程序包含两条注释。;)这就是他想看到的!大多数程序不会有这样的字符串@m-albert你应该小心EOF,你会被解雇的NullPointerException@Peter但有些人可能会。这段代码的要点仅仅是计算注释,而不是批评开发人员的注释