jshell - 无法找到 printf

jshell - unable to find printf

为什么我的 jshell 实例(JDK 版本 9-ea)无法识别 printf() 语句?以下是我观察到的错误,

jshell> printf("Print number one - %d",1)
|  Error:
|  cannot find symbol
|    symbol:   method printf(java.lang.String,int)
|  printf("Print number one - %d",1)
|  ^----^

我可以访问 printf,只要我以常规方式指定它即可。

jshell> System.out.printf("Print number one - %d",1)
Print number one - 1 ==> java.io.PrintStream@1efbd816

有什么指点吗?

没有 jshell 简单地 可以工作吗?这不能像这样工作,因为 outside PrintStream 没有定义这样的方法。

您可以像这样定义自己的 printf

jshell> private  void printf(String s) { System.out.println(s); }

稍后使用它:

jshell> printf("test")
test

Java 是一种面向对象的语言,如果没有与该方法相关联的对象,则不能调用非静态方法。 printf 是 class PrintStream 的非静态方法,没有 PrintStream 实例就无法调用它。

标准 Java 库中有一些 PrintStream 实例,例如 System.outSystem.err,因此您可以调用 System.out.printf()System.err.printf(),但是普通的 printf() 不起作用,因为 jshell 不知道这个 printf() 属于哪个对象。

早期版本的 JShell 有一个预定义的 printf 方法,但它已从早期访问版本中删除。您当然可以定义自己的 printf 方法:

jshell> void printf(String format, Object... args) { System.out.printf(format, args); }

或者您可以通过使用以下命令启动 JShell 来恢复早期版本中的打印方法:

jshell --start DEFAULT --start PRINTING

(如果您只使用 --start PRINTING,您将不会获得默认导入。)

有关详细信息,请参阅实现它的错误 JDK-8172102 in the Java bug database and changeset b2e915d476be

这可能更方便:

jshell> /set start -retain DEFAULT PRINTING

(需要设置一次,下次你可以不带任何参数直接启动jshell)。参见 official jshell documentation