console.readLine() и console.format(): что означают аргументы, на которые ссылаются спецификаторы формата?

У этого вопроса есть дополнительный вопрос здесь.


После этот учебник и компиляции данного RegexTestHarness дает следующее ошибки в console.readLine(String) и console.Format(String) соответственно:

  1. Метод readLine() в типе Console неприменим для аргументов (String)

  2. Формат метода (String, Object[]) в типе Console неприменим для аргументов (String, String, int, int)

Согласно documentation, там требуются два аргумента:

  • public String readLine(String fmt, Object... args)

  • public Console format(String fmt, Object... args)

Второй аргумент типа Object для обоих методов:

  • args — аргументы, на которые ссылаются спецификаторы формата в строке формата. Если аргументов больше, чем спецификаторов формата, дополнительные аргументы игнорируются. Количество аргументов является переменным и может быть равно нулю. Максимальное количество аргументов ограничено максимальным размером массива Java, как определено.

Поэтому я считаю, что это изменилось после публикации учебника.

ВОПРОС:-

Что означают аргументы, на которые ссылаются спецификаторы формата?

Сначала я подумал, что это сами спецификаторы формата, но потом я также получаю сообщение об ошибке в операторе Matcher matcher = pattern.matcher(console.readLine("Enter input string to search: "));.


import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/*
 *  Enter your regex: foo
 *  Enter input string to search: foo
 *  I found the text foo starting at index 0 and ending at index 3.
 * */

public class RegexTestHarness {

    public static void main(String[] args){
        Console console = System.console();
        if (console == null) {
            System.err.println("No console.");
            System.exit(1);
        }
        while (true) {

            Pattern pattern = 
            Pattern.compile(console.readLine("%nEnter your regex: ")); //********ERROR*****

            Matcher matcher = 
            pattern.matcher(console.readLine("Enter input string to search: ")); //********ERROR*****

            boolean found = false;
            while (matcher.find()) {
                console.format("I found the text" +   //********ERROR*****
                    " \"%s\" starting at " +
                    "index %d and ending at index %d.%n",
                    matcher.group(),
                    matcher.start(),
                    matcher.end());
                found = true;
            }
            if(!found){
                console.format("No match found.%n");  //********ERROR*****
            }
        }
    }
}

введите здесь описание изображения


person Solace    schedule 15.06.2014    source источник
comment
Пожалуйста, задавайте по одному вопросу за раз и предоставляйте любой соответствующий код в контексте, а не в виде одной строки.   -  person Ant P    schedule 15.06.2014
comment
@AntP Я задал более одного вопроса?   -  person Solace    schedule 15.06.2014
comment
Согласно документации, там требуются два аргумента - это неверно. Что требуется, так это: хотя бы один аргумент типа String. Необязательно и в зависимости от форматов, используемых (или не используемых) в первом аргументе, может потребоваться 0 или более произвольных объектов.   -  person laune    schedule 15.06.2014


Ответы (2)


Из JavaDoc для Console:

Предоставляет отформатированное приглашение, затем считывает одну строку текста с консоли.

Как это работает? Ну, он использует строку формата с параметрами . Параметры представляют собой массив с переменными аргументами, поэтому вы можете передать ни один из них или несколько без какого-либо специального синтаксиса.

Например

console.readLine("No arguments");

Просто выведет «Нет аргументов» в приглашение.

final String a = "A";
console.readLine("With string, %s", a);

Выведет «Со строкой, A» в подсказку.

final String a = "A";
final int b = 10;
console.readLine("With string %s and a formatted number %.2f", a, b);

Выведет «Со строкой A и отформатированным числом 10,00» в приглашении.

person Boris the Spider    schedule 15.06.2014
comment
Большое спасибо за обширное объяснение. Вы очень хорошо это объяснили, но оператор Matcher matcher = pattern.matcher(console.readLine("Enter input string to search: ")); напоминает первый приведенный вами пример тем, что не содержит спецификаторов формата. Но я все еще получаю ту же ошибку в этом заявлении. - person Solace; 15.06.2014
comment
@Zarah Код, который вы разместили, прекрасно компилируется. Я не запускал его. На каком JDK вы его компилируете? Console был введен в версии 1.6 и всегда был varargs. - person Boris the Spider; 15.06.2014
comment
Возвращаемое значение readLine() обычно должно храниться в переменной String. - person laune; 15.06.2014
comment
@BoristheSpider Я использую jDK 1.8.0_20, я получаю эти ошибки, я только что опубликовал скриншот в вопросе. - person Solace; 15.06.2014
comment
@laune Pattern.compile принимает в качестве аргумента строку, возвращаемую readLine(). Pattern.matcher принимает charSequence в качестве аргумента. Я новичок (не знаю об отношениях между charSequence и String в Java, хотя обычно они должны быть одним и тем же), и я предполагаю, что string, возвращаемый readLine() в более позднем случае, внутренне преобразуется в charSequence - person Solace; 15.06.2014
comment
@ Зара, у тебя случайно нет другого класса под названием Console в том же пакете, что и твой класс, не так ли? - person Boris the Spider; 16.06.2014
comment
@BoristheSpider Нет, не знаю. java.io.Console встроенный класс, верно? Я импортировал его. - person Solace; 16.06.2014
comment
Но моя виртуальная машина, похоже, не имеет консольного устройства. - person Solace; 16.06.2014

Строка формата (в основном) содержит такие элементы, как %d или %s, и эти элементы должны соответствовать выражениям, следующим за строкой формата в вызове метода: это «ссылочные аргументы».

Какую ошибку вы получили при вызове Pattern/Matcher?

person laune    schedule 15.06.2014
comment
Ошибка, упомянутая в вопросе, находится в readLine(), который является аргументом(ами) вызовов Pattern.compile() и pattern.matcher() в следующих операторах: Pattern pattern = Pattern.compile(console.readLine("%nEnter your regex: ")); ` Matcher matcher = pattern.matcher(console.readLine(Введите входную строку для поиска: )); ` - person Solace; 15.06.2014
comment
@Zarah Мне многое было ясно - в чем была ошибка (НЕ ГДЕ)? - person laune; 15.06.2014
comment
Ой, прости, мой плохой! Но ошибки даны в вопросе под номерами 1 и 2 в самом начале вопроса. Согласно ошибке, readLine() и format() нуждаются в другом аргументе типа Object, кроме аргумента String. Я получил эту ошибку в операторе, в строке которого нет спецификатора формата (% d, % s и т. д.): Matcher matcher = pattern.matcher(console.readLine("Enter input string to search: ")); - person Solace; 15.06.2014
comment
@Zarah Как уже прокомментировали другие, вы, должно быть, используете довольно старую версию Java в своей среде IDE. Обновление! - person laune; 15.06.2014
comment
Я не думаю, что JDK1.8.0_20 и соответствие компилятора версии 1.7 настолько стары: с - person Solace; 15.06.2014
comment
Возможно, вы сможете скомпилировать этот код, вызвав javac/JDK1.8.0 из командной строки. Если он компилируется, это свидетельствует о том, что в вашей среде IDE что-то не так. Когда я вызываю console.readLine( intergerObject, "string" ), в сообщении об ошибке читается метод Console.readLine(String,Object...) - обратите внимание на Object.... Но ваша IDE отображает Object[]. - person laune; 15.06.2014