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.