5

为什么我的 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$1 ==> java.io.PrintStream@1efbd816

任何指针?

4

4 回答 4

7

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

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

或者,您可以通过以下方式启动 JShell 来获取早期版本中的打印方法:

jshell --start DEFAULT --start PRINTING

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

有关更多信息,请参阅Java 错误数据库中的错误JDK-8172102和实现它的变更集b2e915d476be 。

于 2017-05-09T07:53:58.883 回答
1

没有jshell是否可以正常工作?这不能像这样工作,因为在外部没有定义这样的方法。 PrintStream

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

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

稍后使用它:

jshell> printf("test")
test
于 2017-05-05T06:51:51.037 回答
1

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

PrintStream标准 Java 库中有一些实例,比如System.outand System.err,所以你可以调用System.out.printf()or System.err.printf(),但是 plainprintf()不起作用,因为jshell不知道它printf()属于哪个对象。

于 2017-05-05T07:06:36.653 回答
0

这可能更方便:

jshell> /set start -retain DEFAULT PRINTING

(需要设置一次。下次你可以简单地启动 jshell 而无需任何参数)。请参阅官方 jshell 文档

于 2017-09-25T12:42:49.413 回答