Em todos os livros sobre Java, eu li que os compilador trata todos os espaços da mesma forma e simplesmente ignora espaços em branco extra, por isso é melhor prática para usá-los livremente para melhorar a legibilidade do código. Eu encontrei a prova de que, em cada expressão que eu escrevi: Não importava se havia espaços ou não, e como muitos (ou talvez eu simplesmente não prestar atenção).
Recentemente, decidi experimentar um pouco com precedência de operador e associação para testar a tabela de precedência em ação e tentou compilação
int a = 2;
int b = 3;
int c = a+++b;
int d = a+++++b;
Enquanto a primeira declaração compilado perfeitamente, este último produziu uma exceção:
Exception in thread java.lang.RuntimeException "principal": o código-fonte Uncompilable - tipo inesperado. Necessário: variável. Encontrado: valor.
No entanto, quando eu adicionei espaços: int d = a++ + ++b
, é compilado. Por que é este o caso? Java é dito para ignorar espaços em branco extra de qualquer maneira. (Eu tenho Java 8 e NetBeans IDE 8.2, se isso importa.)
Eu acho que isso pode ter algo a ver com a forma como expressões são analisados, mas eu não tenho certeza. Eu tentei olhar-se várias perguntas sobre a análise, os espaços em branco e operadores sobre SO e no Google, mas não conseguiu encontrar uma resposta definitiva.
UPD. Para lidar com os comentários que ele é o 'extra' que importa, não todos os espaços: uma vez int c = a++ + b;
e int c=a+++b;
ambos compilação, pode-se dizer, por analogia, que no int d = a ++ + ++b;
espaço em branco é 'extra' também.
Java Specification Language secção 3.2 , "lexicais Traduções", diz (grifo meu):
Um fluxo de caracter Unicode bruto é traduzido para uma sequência de sinais , usando as seguintes três passos de tradução lexicais, os quais são aplicados, por sua vez:
A tradução de Unicode escapa [...]
Uma tradução [...] em uma corrente de caracteres de entrada e terminadores de linha [...].
A tradução da sequência de caracteres de entrada e terminadores linha resultante da Fase 2 em uma sequência de elementos de entrada (§3.5) que, depois de o espaço em branco (§3.6) e comentários (§3.7) são descartados, compreendem as fichas (§3.5) que são os símbolos terminais da gramática sintática (§2.3).
O mais longo possível tradução é usado em cada etapa , mesmo que o resultado não, finalmente, fazer um programa correto, enquanto outra tradução lexical faria.
Assim, os caracteres de espaço em branco são descartados, mas após a "sequência de elementos de entrada" é determinada. Seção 3.5, "Input Elements e fichas", diz:
O espaço em branco (§3.6) e comentários (§3.7) pode servir para os tokens separados que, se adjacente, pode ser indexado de outra maneira. Por exemplo, os caracteres ASCII - e = no de entrada pode formar o operador símbolo - = (§3.12) somente se houver nenhum está intervindo espaço em branco ou comentário.