2015-07-19 20 views
10

Il mio mistero inizia così. Considerate questo pezzo di codice:Java: mai visto un compilatore o uno strumento che REISCE una virgola finale nell'inizializzatore dell'array?

import java.util.Set; 
import javax.annotation.processing.*; 
import javax.lang.model.element.TypeElement; 

@SupportedOptions({ 
    "thing1", 
    "thing2", 
}) 
public class fc extends AbstractProcessor 
{ 
    @Override 
    public boolean process(Set<? extends TypeElement> anns, RoundEnvironment re) 
    { 
    return false; 
    } 
} 

Se si guarda oltre la maggior parte del ponteggio (Volevo solo assicurarsi che sia minimamente completa e si può eseguire il compilatore su di esso), si vedrà in mezzo c'è un annotazione e richiede un inizializzatore dell'array di stringhe e una virgola dopo "thing2". Ora, se sei il tipo che porta lo Java Language Specification a letto con te durante la notte, ti ricorderai che una virgola finale è perfettamente valida, "potrebbe apparire dopo l'ultima espressione in un inizializzatore di array e viene ignorata." Quindi, se provi questo nel tuo preferito javac, non sarai sorpreso che compila perfettamente.

Quindi ecco il mistero. L'esempio sopra riportato è condensato direttamente da a real patch che è stato richiesto in un progetto reale a causa di a real "illegal start of expression" compiler message che qualcuno ha ricevuto durante la creazione di quel progetto e se ne è andato quando ha eliminato la virgola finale.

Così chiaramente che la persona era utilizzando una versione braindamaged di javac, o ha avuto qualche altro strumento munging fonte whizbang nella sua toolchain che non ha ottenuto la grammatica Java perfettamente ragione, e mentre lui ha dato le informazioni altrimenti complete nel suo rapporto di bug, in questo caso l'unica informazione che conta davvero è il cui compilatore e toolchain e quale versione stava usando, e lui non ha fornito nulla di tutto ciò! Quindi non solo è stata creata una patch spuria per il codice che non ne ha avuto bisogno, ma non ci sono abbastanza informazioni per presentare una segnalazione di bug in cui deve davvero andare, il fornitore di strumenti che fornisce errori spuri su Java valido.

Quindi, sto sorta di crowdsourcing questo :) ... chiunque può trovare un compilatore Java o un altro strumento correlato che non lo fa compilare il codice di cui sopra con successo, ma le bandiere un errore simile a quello che è stato riportato in questo esempio? Allora forse sapremo qual è il colpevole.

Sono solo parzialmente irritato perché è stato il mio codice che è stato fittamente corretto;) ... mi dà fastidio almeno che ci possa essere qualche strumento ancora là fuori che non è stato corretto, e confondere più persone su ciò che è Java e ciò che non lo è, e portare a patch più strane per codificare che va bene.

Grazie!

risposta

6

IntelliJ IDEA compila il codice correttamente (ovviamente), ma mostra un messaggio di avviso nella categoria 'stranezze javac' (mal disegnati a mano libera sottolineatura mia):

Screenshot

Così sembra che non è così tanto braindead o esotici javac s che lottano con le virgole finali, solo quelle vecchie.

Esso è stato risolto in JDK 7 e la correzione è stata backport di versioni più recenti di JDK 6.

+0

Wow ... chi avrebbe mai detto era di proprietà di Oracle? Ho usato solo Java/Oracle 'javac' sul codice, suppongo di aver avuto fortunatamente versioni prima o dopo quell'errore? Non l'ho mai visto non compilato. Pazzo. Grazie per i link definitivi! –

+0

Sì, ti aspetteresti che il team di JDK sia in grado di recitare a memoria l'intero JLS ormai. Tutti fanno errori, credo. –

+0

Sono sorpreso che un IDE abbia fornito una descrizione completa di una cosa del genere. IntelliJ è più avanzato di quanto pensassi .. Questo mi fa domandare quali siano le altre "stranezze" esistenti –