Java 程序的执行语句序列 [已关闭]

The sequence of executed statements of a Java program [closed]

提问人:Luka Fürst 提问时间:11/13/2023 最后编辑:Mark RotteveelLuka Fürst 更新时间:11/14/2023 访问量:88

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

10天前关闭。

给定一个 Java 程序,我想运行它并确定执行语句的顺序。例如,在运行程序时

import java.util.Scanner;

public class Temp {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  // line 4
        int n = sc.nextInt();
        int m = n;
        if (n > 0) {
            m = 2 * n;
        } else {
            m = 3 * n;
        }
    }
}

使用负整数作为输入,我想获得序列 4、5、6、7、10(可能没有 7),指的是执行的行。

当然,人们总是可以在源代码中的每个语句之后添加一个 System.out.println,但我想知道是否有更优雅的方法。

Java 代码覆盖率 执行

评论

0赞 Lore 11/13/2023
提示:在执行代码之前,可以通过 n 个值来确定它。
1赞 jhamon 11/13/2023
你为什么要这样做?如果是出于调试目的,一些放置良好的日志和最终的单个堆栈跟踪应该就足够了。
0赞 Reilas 11/14/2023
你指的是字面上的“陈述”,还是只是一个“表达”
0赞 Luka Fürst 11/15/2023
感谢您的所有回答!实际上,这个问题可以通过在每个分号后添加一个System.out.println来解决,因为我只需要跟踪简单的语句。我一直在想,是否有更优雅的方法,例如,让JVM“记住”它实际执行的指令,并使用源代码语句和JVM指令之间的对应关系(这种对应关系必须存在 - 否则JVM怎么知道源代码中的哪一行抛出了异常?)来列出已执行的源代码语句。

答:

1赞 geanakuch 11/13/2023 #1

我不认为它会那样工作。你肯定必须对执行的每一行都使用 a,尽管你可以先在 a 中收集这些行号,然后在最后显示它们。System.outList

如果你真的打算自动获取行号,你必须抓取堆栈跟踪

Thread.currentThread().getStackTrace()[0].getLineNumber()

这将为您提供您当前所在的行号(这显然是该确切语句的编号)。如果需要,还可以将其移动到单独的函数中,然后向上移动堆栈跟踪以获取行号。

但是,你真的不应该那样做。抓取堆栈跟踪是 Java 中最昂贵的操作之一。你真的不想对你执行的每个语句都这样做,除非性能对你完全没有价值。

1赞 Honza Zidek 11/13/2023 #2

您可以通过代码覆盖率达到请求的效果。

  1. JUnit 测试中调用代码。
  2. 将 IDE 中的代码作为“run test with coverage”运行。最有可能的是,您必须在IDE中安装一些“测试覆盖率”插件。
  3. 您将直接在 IDE 中看到所有标记为绿色的行。

例如,对于 IntelliJ IDEA,该插件称为“代码覆盖率”:

enter image description here

你像这样运行它:

enter image description here

然后,在 IDE 的 “coverage” 窗口中看到结果:

enter image description here

单击类名后,请注意左侧的绿色和红色“标记”:

enter image description here