You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Jshell中给printf后加println()会屏蔽打印流变量输出?

JShell中printf链式调用println()的输出差异解释

两种执行场景

场景1:仅调用printf()

jshell> System.out.printf("5 * 2 = %d & 8 * 10 = %d", 5*2, 8*10)
5 * 2 = 10 & 8 * 10 = 80$9 ==> java.io.PrintStream@68de145

jshell> 

场景2:printf()后链式调用println()

jshell> System.out.printf("5 * 2 = %d & 8 * 10 = %d", 5*2, 8*10).println()
5 * 2 = 10 & 8 * 10 = 80

jshell> 

问题解析

核心原因:JShell的输出规则 + 方法返回值类型

用入门级的大白话拆解:

  1. JShell的默认行为:如果你输入的是一段没有赋值给变量的代码,JShell会自动执行它;如果这段代码有返回值(不是“无返回”的类型),就会把返回值打印出来,还会给它分配一个临时变量(比如例子里的$9)。
  2. printf()的返回值:System.out.printf()执行完内容输出后,会返回它自己所属的打印流对象(也就是System.out对应的PrintStream实例),所以第一种场景里,JShell在输出完计算结果后,又把这个返回的对象打印出来,就是你看到的$9 ==> java.io.PrintStream@68de145。
  3. println()的返回值:println()方法的返回值是void,也就是完全没有返回值。当你链式调用printf(...).println()时,整个代码的最终返回值是println()的void,JShell遇到返回值为void的代码,只会执行方法本身(也就是printf输出内容、println换行),不会打印任何返回值相关的内容。

你误以为“变量应该在println换行前输出”,是混淆了链式调用的返回值逻辑:JShell只关心整个代码最后一步的返回值,不会打印中间步骤的返回值。虽然printf确实返回了PrintStream对象,但后续调用println()后,整个代码的结果变成了void,所以JShell不会再打印那个PrintStream对象。

内容的提问来源于stack exchange,提问作者r4dii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:05:09