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

Cod*_*Man 6 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]++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

断点

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

断点设置

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

void
1
void
1
void
1
void
1
void
1
void
1
Run Code Online (Sandbox Code Playgroud)

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

Emi*_*rey 4

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

该方法的 JavaDoc可在此处PrintStream.println(int)获取(适用于 Java 9),您可以在此处查看该方法的源代码(来自 OpenJDK JDK 版本 8u40-b25 又名 Java 8)。


考虑以下方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

当您评估返回有效返回类型(例如原始类型)的方法调用时int,您将获得该方法的返回值。

使用评估并登录evaluatesToVoid()将打印以下内容:

void
1
1
Run Code Online (Sandbox Code Playgroud)

使用评估并登录evaluatesToSeven()将打印以下内容:

7
Run Code Online (Sandbox Code Playgroud)