błąd javac: nazwy klas są akceptowane tylko wtedy, gdy wyraźnie zażądano przetwarzania adnotacji

113

Otrzymuję ten błąd, kiedy kompiluję mój program Java:

error: Class names, 'EnumDevices', are only accepted if annotation 
processing is explicitly requested
1 error

Oto kod java (uruchamiam go na Ubuntu).

import jcuda.CUDA;    
import jcuda.driver.CUdevprop;    
import jcuda.driver.types.CUdevice;

public class EnumDevices {

  public static void main(String args[]) {
     CUDA cuda = new CUDA(true);    
        int count = cuda.getDeviceCount();

        System.out.println("Total number of devices: " + count);

        for (int i = 0; i < count; i++) {

          CUdevice dev = cuda.getDevice(i);
          String name = cuda.getDeviceName(dev);
          System.out.println("Name: " + name);
          int version[] = cuda.getDeviceComputeCapability(dev);

          System.out.println("Version: " + 
              String.format("%d.%d", version[0], version[1]));
          CUdevprop prop = cuda.getDeviceProperties(dev);
          System.out.println("Clock rate: " + prop.clockRate + " MHz");
          System.out.println("Threads per block: " + prop.maxThreadsPerBlock);
        }
    }
}

Oto polecenie javac:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

Jak skompilować ten program?

user513164
źródło

Odpowiedzi:

132

Musisz przynajmniej dodać .javarozszerzenie do nazwy pliku w tej linii:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

Z oficjalnego FAQ :

Nazwy klas „HelloWorldApp” są akceptowane tylko wtedy, gdy wyraźnie zażądano przetwarzania adnotacji

Jeśli pojawi się ten błąd, zapomniałeś dołączyć przyrostek .java podczas kompilowania programu. Pamiętaj, że polecenie to javac HelloWorldApp.java, a nie javac HelloWorldApp.

Również w drugim przykładzie javac (w którym faktycznie umieściłeś .java) musisz dołączyć wszystkie wymagane pliki .jar potrzebne do kompilacji.

aioobe
źródło
1
to też, ale myślę, że nadal nie spowodowałoby tego konkretnego błędu. Powinien był dać "nie znaleziono pliku" lub coś podobnego.
jwenting
Zgodziłbym się. Zwłaszcza, że ​​jest to łatwy błąd (gdyż .classnależy go pominąć przy starcie z java).
aioobe,
„Nazwy klas„ HelloWorldApp ”są akceptowane tylko wtedy, gdy wyraźnie zażądano przetwarzania adnotacji”. Co za głupi sposób na stwierdzenie, że plik nie został znaleziony. Albo do czego ma się odnosić komunikat o błędzie? Mogę tylko znaleźć tę poprawkę, ale nie wiem, dlaczego komunikat o błędzie jest tak sformułowany.
masterxilo
1
Po włączeniu przetwarzania adnotacji można programowo generować klasy podczas kompilacji. Dzięki przetwarzaniu adnotacji można w rzeczywistości coś skompilować, nawet jeśli plik nie istnieje (tj. Tworzysz brakujące części w locie). To prawda, komunikat o błędzie wprowadza w błąd. Skontaktuję się z tobą, jeśli dokładniej się temu przyjrzę.
aioobe
19

Zaskoczyło mnie to również, ponieważ uwzględniłem rozszerzenie .Java ... potem zauważyłem stolicę J.

Spowoduje to również błąd „przetwarzanie adnotacji”:

javac myclass.Java 

Zamiast tego powinno być:

javac myclass.java 
Tom Warfield
źródło
6

Użyj javac ClassName.java do skompilowania programu, a następnie użyj java ClassName do wykonania skompilowanego kodu. Nie można mieszać języka javac tylko z nazwą ClassName (bez rozszerzenia java).

Yong Yuan
źródło
5

Błąd „Nazwy klas są akceptowane tylko wtedy, gdy wyraźnie zażądano przetwarzania adnotacji” może być spowodowany co najmniej jednym z następujących powodów:

  1. Nieużywanie rozszerzenia .java dla pliku java podczas kompilacji.
  2. Niewłaściwa wielkość liter w rozszerzeniu .java (np. .Java) podczas kompilacji.
  3. Wszelkie inne błędy w rozszerzeniu .java podczas kompilacji.
  4. Podczas jednoczesnego kompilowania i uruchamiania zapominamy o użyciu znaku „&&” do połączenia dwóch poleceń (np. Javac Hangman.java java Hangman). Zajęło mi to około 30 minut, co zauważyłem, uruchamiając kompilację i uruchamiając program oddzielnie, co oczywiście działało doskonale.

Może to nie jest pełna lista przyczyn tego błędu, ale są to przyczyny, o których do tej pory jestem świadomy.

joshgoldeneagle
źródło
3
chandan@cmaster:~/More$ javac New.java
chandan@cmaster:~/More$ javac New
error: Class names, 'New', are only accepted if annotation processing is explicitly requested
1 error

Więc jeśli przez pomyłkę po kompilacji ponownie użyj javacdo uruchomienia programu.

chandan
źródło
3

Dowiedziałem się, że ten błąd można również uzyskać, przechowując plik źródłowy w folderze o nazwie Java

David Miller
źródło
2

Myślę, że jest to również spowodowane nieprawidłową kompilacją.

więc dla Linuksa (ubuntu) .....

javac file.java

plik java

Amol Jagdale
źródło
3
Odpowiedzi powinny w pierwszej kolejności starać się wyjaśnić, dlaczego problem jest spowodowany, a następnie wskazać rozwiązanie (jeśli jest dostępne)
Coder,
1

Jak odtworzyć ten tajemniczy błąd na terminalu Ubuntu:

Umieść to w pliku o nazwie Main.java:

public Main{
    public static void main(String[] args){
        System.out.println("ok");
    }
}

Następnie skompiluj to w ten sposób:

user@defiant /home/user $ javac Main
error: Class names, 'Main', are only accepted if 
annotation processing is explicitly requested
1 error

To dlatego, że nie określiłeś tego .javana końcu Main.

Zrób to w ten sposób i działa:

user@defiant /home/user $ javac Main.java
user@defiant /home/user $

Uderz teraz w czoło i narzekaj, że komunikat o błędzie jest tak tajemniczy.

Eric Leschinski
źródło
2
ty też nie: D! napisałeś Main bez .java w obu przykładach!
freerunner
1

Być może kompilujesz z nazwą pliku zamiast nazwy metody .... Sprawdź raz i ja popełniłem ten sam błąd, ale szybko go poprawiłem ..... # happy Coding

Sai Saran
źródło
0

najpierw pobierz jdk z https://www.oracle.com/technetwork/java/javase/downloads/index.html . Następnie w wyszukiwaniu napisz Edytuj zmienne środowiskowe systemu W otwartym oknie wciskam dół o nazwie Zmienne środowiskowe Następnie w Zmienne systemowe wpisz tutaj opis obrazka Wciśnij dół nowy W polu nowe zmienne wpisz "Ścieżka" W polu nowa wartość Zapisz katalog w folderze bin w jdk jak " C: \ Program Files \ Java \ jdk1.8.0_191 \ bin "ale w moim systemie operacyjnym działa tylko to" C: \ Program Files \ Java \ jdk1.8.0_191 \ bin \ javac.exe " wprowadź opis obrazu tutaj naciśnij ok 3 razy

Uruchom Cmd. Wciskam dolne okna + R. Następnie piszę cmd. W cmd napisz "cd (twój katalog z kodem)" wygląda jak C: \ Users \ user \ IdeaProjects \ app \ src. Następnie napisz "javac (nazwa twojej głównej klasy twojego programu) .java" wygląda jak blabla.java i javac utwórz kod bajtowy, taki jak (nazwa twojej głównej klasy) .class w twoim katalogu. ostatnio napisz w cmd "java (nazwa twojej głównej klasy)" i mój program zacznie działać

Panie Tintin
źródło
0

Błąd: nazwa klasy jest akceptowana tylko wtedy, gdy przetwarzanie adnotacji jest jawnie żądane

Aby uniknąć tego błędu, należy użyć polecenia javac z rozszerzeniem .java.

Javac DescendingOrder.java <- to działa idealnie.

Avnish
źródło
0

Jeśli kompilujesz wiele plików w tej samej linii, upewnij się, że używasz javac tylko raz, a nie dla każdego pliku klas.

Błędny: wprowadź opis obrazu tutaj

Poprawny: wprowadź opis obrazu tutaj

kiran
źródło