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

标签 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”?

最佳答案

这是因为 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/

相关文章:

java - JDK 9+ 内置类加载器 ModuleReference 解析将使用类路径(而不是 Jar)来查找资源

intellij-idea - 如何从 Gradle 存储库向 IN Idea 项目添加外部库?

java - JVM 错误 : Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

android - Intellij 12 maven library Android RestTemplate 麻烦处理javax/xml/parser/DocumentBuilder.class

java - 无需重新启动服务器即可获取更新的属性文件标签 java

java - 如何强制Tomcat(部署在eclipse中)自动重新加载更改的文件

java - 在 Couchbase 中查询 View ,Java 客户端

运行appium脚本时出现java.lang.ClassNotFoundException

java - 使用 Java 库的 Funtime 错误要求我拥有 JRE 8,但库需要使用 IDEA 的 JDK 6

java - 在 Tomcat 下运行的现有 Web 应用程序中将 Java 类公开为 Web 服务