2015-07-19 10 views
10

Moja tajemnica zaczyna się tak. Rozważmy następujący fragment kodu:Java: kiedykolwiek widziałem kompilator lub narzędzie, które ODMÓWI ostatni przecinek w inicjatorze tablicowym?

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; 
    } 
} 

Jeśli spojrzeć przeszłości większość rusztowań (Chciałem tylko upewnić się, że minimalnie kompletna i można uruchomić kompilator na nim), zobaczysz w środku Jest takie adnotacja, i pobiera inicjator tablicy String, a po "thing2" jest przecinek. Teraz, jeśli jesteś w rodzaju osób, które zabierają ze sobą Java Language Specification do łóżka, pamiętaj, że ostatni przecinek jest całkowicie poprawny, "może pojawić się po ostatnim wyrażeniu w inicjatorze tablicy i jest ignorowany." Więc jeśli spróbujesz tego w swoim ulubionym javac, nie będziesz zaskoczony, że kompiluje się idealnie.

Oto tajemnica. Powyższy przykład jest skondensowany prosto z a real patch, który został zgłoszony w prawdziwym projekcie z powodu a real "illegal start of expression" compiler message, który ktoś otrzymał podczas budowania tego projektu, i odszedł, kiedy usunął ostatni przecinek.

Tak więc ta osoba używała opatrznościowej wersji javac lub posiadała inne narzędzie do zgadywania źródła w swoim pakiecie narzędzi, które nie ma poprawnie gramatyki języka Java, i podczas gdy w swoim raporcie o błędach podał inne informacje, w tym przypadku jedyną informacją, która naprawdę ma znaczenie, byłby kompilator i toolchain oraz wersja, której używał, a on tego nie dostarczył! Tak więc powstała nie tylko fałszywa poprawka do kodu, która jej nie potrzebowała, ale nie ma wystarczającej ilości informacji, aby złożyć raport o błędzie, gdzie naprawdę musi się udać, dostawca narzędzi, który daje fałszywe błędy na poprawnej Javie.

Tak, jestem w rodzaju crowdsourcingu tego :) ... może ktoś znaleźć kompilator Java lub inne podobne narzędzie, które nie skompilować powyższy kod pomyślnie, ale flaguje błąd podobny do tego, co zostało zgłoszone w ten przykład? Wtedy może dowiemy się, co to był winowajca.

Jestem tylko częściowo zirytowany, ponieważ to był mój kod, który został nieprawidłowo załatany;) ... to budzi mnie co najmniej tyle, że może być jeszcze jakieś narzędzie, które nie zostało naprawione i myląc więcej osób na temat tego, czym jest Java, a co nie, i prowadząc do bardziej dziwnych łatek do kodu, co jest w porządku.

Dzięki!

Odpowiedz

6

IntelliJ IDEA kompiluje kod poprawnie (oczywiście), ale ma pokazać ostrzeżenie w kategorii „javac dziwactw” (źle rysowane odręczne podkreślenie moje):

Screenshot

więc wydaje się, że nie jest tak wiele braindead lub egzotycznych javac s, które zmagają się z ciągłym przecinkiem, tylko stare.

Została ona ustalona w JDK 7 i poprawka została przeniesiona do nowszych wersji JDK 6.

+0

Wow ... kto by pomyślał był właścicielem firmy Oracle? Używałem tylko kodu 'javac" Sun/Oracle na samym kodzie, myślę, że na szczęście miałem wersje przed lub po tym błędzie? _I_ nigdy nie widziałem, żeby to się nie kompilowało. Zwariowany. Dzięki za ostateczne linki! –

+0

Tak, można by się spodziewać, że zespół JDK będzie w stanie recytować całe JLS na pamięć. Wszyscy myślę, że popełniam błędy. –

+0

Jestem zaskoczony, że IDE podało pełny opis czegoś takiego. IntelliJ jest bardziej zaawansowany, niż myślałem ... Zastanawiam się, jakie inne "dziwactwa" istnieją. –

Powiązane problemy