1$
называется Явное индексирование , последующий формат %1$d
не приведет к увеличению индекса, поэтому он также будет использовать 456
для форматирования %b
и в соответствии с документ :
Если аргумент arg равен нулю, то результатом является «ложь». Если Арг является
логическое или логическое, то результатом является строка, возвращаемая
String.valueOf (Arg). В противном случае результатом будет «true».
Вот почему вы всегда получаете true
.
Чтобы получить ложь:
System.out.printf("%1$d + %b", null); // null + false
или удалить явное индексирование:
System.out.printf("%d + %b", 456, null); // 456 + false
Проверьте документ java.uti.Formatter
, чтобы узнать больше.