为什么intellij在使用评估日志作为断点时打印“void”?

时间:2018-05-05 12:54:31

标签: java intellij-idea

我在intellij中编写了这个Java代码:

public class Main {
    public static void main(String[] args) {
        int[] a = {1,1,1,1,1,1};
        for(int i = 0; i < a.length; ++i) {
            a[i]++;
        }
    }
}

接下来我在for循环中设置一个断点,就像这样。

Breakpoint

接下来我转到“查看断点”菜单,可以通过ctrl + shift + f8进行访问,并为我的断点输入这些设置。

Breakpoint settings

然后我按下调试按钮,我的输出是这样的:

void
1
void
1
void
1
void
1
void
1
void
1

为什么intellij在输出中打印“void”?

1 个答案:

答案 0 :(得分:2)

这是因为println()方法被声明为void。在调试模式下计算表达式时,它会根据表达式的结果生成一个文字值。因此,当您评估表达式System.out.println(a[i])时,您实际上是在告诉调试器打印方法的返回值的内容,该值恰好是void。碰巧在该方法中,执行了额外的println(int)方法调用,使得实际的计算表达式基本上等同于此puedocode System.out.println(System.out.println(a[i]))(当然,实际上Java并没有对待{{1}作为一个真正的类型,所以你将无法按照书面形式实际执行代码。)

void方法的JavaDoc可用here(对于Java 9),您可以查看方法here的源代码(来自OpenJDK JDK版本8u40-b25又名Java 8)。

考虑以下方法:

PrintStream.println(int)

当您评估返回有效返回类型的方法调用时,例如基本类型void evaluatesToVoid(){ final int[] a = {1,1}; for(int i = 0; i < a.length; ++i) { System.out.println(a[i]); } return; } int evaluatesToSeven(){ return 7; } ,您将获得方法的返回值。

使用评估和登录int会打印出来:

evaluatesToVoid()

使用评估和登录void 1 1 会打印出来:

evaluatesToSeven()