Строка Java против аргумента командной строки - PullRequest
0 голосов
/ 22 июля 2011

Почему так получается, что аргумент командной строки, передаваемый классу Java, кажется автоматически экранированным, тогда как в экземпляре объекта String escape-символ (), по-видимому, игнорируется.

Например, если начать сСтрока, подобная этой:

SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

И я пытаюсь запустить его через простой класс, подобный этому:

public class EscapeTest {
    public static void main (String[] args) {
        String str = "SELECT * FROM my_table WHERE " 
                     + "my_col like 'ABC_\' ESCAPE '\'";
        System.out.println("ARGS[0]: "+args[0]);
        System.out.println("STR: "+str);
}
}

, и я передаю приведенный выше оператор "SELECT" в качестве аргумента командной строки,Я получаю вывод, который выглядит следующим образом:

ARGS[0]: SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

STR: SELECT * FROM my_table WHERE my_col like 'ABC_' ESCAPE ''

Если я смотрю на значение ARGS [0] в отладчике Eclipse, я вижу, что косые черты экранированы.Почему это происходит?Я думаю, что это довольно сложно предсказать.

1 Ответ

2 голосов
/ 22 июля 2011

Содержимое вашей строки str не содержит обратной косой черты.Они обрабатываются компилятором Java, понимая escape-последовательности строковых литералов Java.

Предполагается, что процессор командной строки не делает это - он не обрабатывает обратную косую черту специально, в любом случае, хотяэто будет зависеть от вашей оболочки.(В большинстве оболочек Unix будет обрабатывать обратную косую черту по-другому. Я предполагаю, что вы работаете в Windows.)

Итак, ваш аргумент командной строки имеет обратные слеши вОни не избежали выполнения Java-процесса - они просто «там» в строке.

Теперь звучит так, будто отладчик экранирует строку при ее отображениидля вас, чтобы вы могли видеть такие вещи, как вкладки и новые строки.Важно понимать, что это просто способ, которым отладчик отображает строку - в самой строке Java не существует такого понятия как «escape».

EDIT: Согласно комментарию:

Чтобы выразить эту строку в исходном коде Java, вы должны экранировать обратную косую черту:

String str = "SELECT * FROM my_table WHERE my_col like 'ABC_\\' ESCAPE '\\'"; 

Обратную косую черту необходимо экранировать, поскольку обратная косая черта является escape-символом в строковых литералах Java.

...