Как это действительный код Java? (запутанная Java)
Этот код выглядит явно некорректно, и все же он успешно компилируется и запускается на моей машине. Может кто-нибудь объяснить, как это работает? Например, что делает ")" после имени класса допустимым? Как насчет случайных слов, разбросанных вокруг?
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
Тест онлайн: https://ideone.com/t1W5Vm
Источник: /questions/6852484/gde-razmestit-kod-glavnoj-stranitsyi-v-prilozhenii-mvc/6852490#6852490
3 ответа
Один из способов расшифровать происходящее - взглянуть на программу посимвольно ( демо).
Там вы можете обнаружить, что персонажи в позициях 7
а также 42
специальные символы Юникода RLO
(справа налево) и LRO
(слева направо) символы.
Как только вы удалите их, программа начнет выглядеть нормально:
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
Хитрость в том, почему запутанная программа компилируется, заключается в том, что компилятор Java игнорирует эти специальные символы как символ формата.
Это допустимый код Java, но он использует арабские невидимые символы нулевой ширины ubicode "выровнять по правому краю". Попробуйте поместить курсор в текст и нажмите стрелку вправо. Между "M" и ")" и "char[]" и "a[]" есть одно и то же.
Я пытался отформатировать код, но это просто расстраивает навигацию в нем.
Вы найдете две последовательности Unicode в вашем источнике
0xE2 0x80 0xAE http://www.fileformat.info/info/unicode/char/202e/index.htm
0xE2 0x80 0xAD http://www.fileformat.info/info/unicode/char/202d/index.htm
эффективно написание части:{public static void main(String[]a
справа налево