Лексемы (tokens) – это элементарные законченные слова языка. Компилятор разбивает поток исходного текста на лексемы и предпринимает попытку выяснить, из каких идентификаторов, операторов, выражений и Т.д. состоит код. Символы пробела (собственно пробелы, знаки табуляции, перевода строки и возврата каретки) не являются значимыми, за исключением тех, которые разделяют лексемы или расположены внутри символьных или строковых литералов. Если взять любой прав ильный код и добавить в него произвольное количество Символов пробела (только не внутри конкретных лексем и символьных или Строковых литералов), на результат компиляции и последующего выполнения Программы это никак не повлияет.
Одно из основных применений символов пробела связано с разделением лексем, которые в противном случае слились бы воедино. Например, в выражении
return 0;
символ пробела между лексемами return и 0 удалять нельзя, поскольку иначе будет получена довольно бессмысленная инструкция
return 0;
Дополнительные пробелы обычно вводят в процессе набора исходного текста для обеспечения удобочитаемости – компилятором они игнорируются. Заметьте, компилятор трактует комментарии как еще одну разновидность символов пробела.
Функция лексического анализа, реализованная в составе компилятора, действует в соответствии с так называемым "жадным" алгоритмом. Для получения очередной лексемы она пытается объединить возможно большее число Символов, не заботясь при этом о синтаксической правильности последовательности Лексем. Так, например, поскольку ++ длиннее, чем +, выражение
j = i+++++i; // НЕВЕРНО!
интерпретируется как синтаксически неправильное
j = i++ ++ +i; // НЕВЕРНО!
вместо верного
j = i++ + ++i;
Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.