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!
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! –
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. –
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ą. –