jshell - невозможно найти 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$1 ==> java.io.PrintStream@1efbd816

Есть указатели?

4 ответа

Решение

Более ранняя версия 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 в базе данных ошибок Java и набор изменений b2e915d476be, который ее реализовал.

Это просто работает без jshell? Это не может работать так, поскольку такой метод не определен за пределами PrintStream,

Вы можете определить свой собственный printf как это:

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

И позже используйте это:

jshell> printf("test")
test

Java является объектно-ориентированным языком, и вы не можете вызывать нестатический метод без объекта, связанного с этим методом. printf это нестатический метод класса PrintStream и вы не можете позвонить без PrintStream пример.

Есть некоторые PrintStream экземпляры в стандартной библиотеке Java, как System.out а также System.errтак что вы можете позвонить System.out.printf() или же System.err.printf(), но добрая printf() не работает, потому что jshell не знает какой объект это printf() принадлежит.

Это может быть удобнее:

jshell> /set start -retain DEFAULT PRINTING

(Нужно установить это один раз. В следующий раз вы можете просто запустить jshell без каких-либо аргументов). Смотрите официальную документацию jshell.

Другие вопросы по тегам