我用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循环内设置一个断点。

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

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

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

最佳答案

这是因为println()方法被声明为void。当您在 Debug模式下评估表达式时,它将根据表达式的结果生成一个文字值。因此,当您评估表达式System.out.println(a[i])时,您实际上是在告诉调试器打印方法返回值的内容,该值恰好是void。碰巧在该方法中执行了一个额外的println(int)方法调用,从而使实际求值表达式基本上等效于该puedocode System.out.println(System.out.println(a[i]))(尽管实际上Java实际上并不将void视为真实类型,因此您将无法以实际执行所编写的代码)。PrintStream.println(int)方法的JavaDoc可用here(对于Java 9),并且您可以查看here方法的源代码(来自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;
}
当评估返回有效返回类型(例如原始类型int)的方法调用时,您将获得该方法的返回值。
使用评估并登录evaluatesToVoid()将输出以下内容:
void
1
1
使用评估并登录evaluatesToSeven()将输出以下内容:
7

关于java - 为什么将评估日志用作断点时intellij打印 “void”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50189675/

10-14 14:16