Co oznacza błąd „Nie można znaleźć symbolu” lub „Nie można rozwiązać symbolu”?


395

Wyjaśnij następujące informacje o błędach „Nie można znaleźć symbolu” i „Nie można rozwiązać symbolu”:

  • Co mieli na myśli?
  • Jakie rzeczy mogą je powodować?
  • Jak programista je naprawia?

To pytanie ma na celu ujęcie wyczerpujących pytań i odpowiedzi na temat typowych błędów kompilacji w Javie.

Odpowiedzi:


417

0. Czy jest jakaś różnica między tymi dwoma błędami?

Nie całkiem. „Nie można znaleźć symbolu” i „Nie można rozwiązać symbolu” oznaczają to samo. Niektóre kompilatory Java używają jednej frazy, a niektóre drugiej.

1. Co oznacza błąd „Nie można znaleźć symbolu”?

Po pierwsze, jest to błąd kompilacji 1 . Oznacza to, że albo występuje problem w kodzie źródłowym Java, albo jest problem ze sposobem jego kompilacji.

Twój kod źródłowy Java składa się z następujących rzeczy:

  • Słowa kluczowe: jak true, false, class, while, i tak dalej.
  • Literówki: jak 42i 'X'i "Hi mum!".
  • Operatorów i inne tokeny niealfanumeryczne: jak +, =, {i tak dalej.
  • Identyfikatory: jak Reader, i, toString, processEquibalancedElephants, i tak dalej.
  • Komentarze i białe znaki.

Błąd „Nie można znaleźć symbolu” dotyczy identyfikatorów. Po skompilowaniu kodu kompilator musi ustalić, co oznacza każdy identyfikator w kodzie.

Błąd „Nie można znaleźć symbolu” oznacza, że ​​kompilator nie może tego zrobić. Twój kod wydaje się odnosić do czegoś, czego kompilator nie rozumie.

2. Co może powodować błąd „Nie można znaleźć symbolu”?

Jako pierwsze zamówienie istnieje tylko jedna przyczyna. Kompilator szukał we wszystkich miejscach, w których należy zdefiniować identyfikator , i nie mógł znaleźć definicji. Może to być spowodowane wieloma rzeczami. Najczęstsze z nich są następujące:

  • W przypadku identyfikatorów ogólnie:
    • Być może wpisałeś to imię niepoprawnie; tj. StringBiulderzamiast StringBuilder. Java nie może i nie będzie próbowała kompensować błędów pisowni lub pisania.
    • Być może źle zrozumiałeś sprawę; tj. stringBuilderzamiast StringBuilder. Wszystkie identyfikatory Java uwzględniają wielkość liter.
    • Być może niewłaściwie użyłeś podkreślenia; tj. mystringi my_stringsą różne. (Jeśli będziesz przestrzegać zasad stylu Java, będziesz w dużej mierze chroniony przed tym błędem ...)
    • Być może próbujesz użyć czegoś, co zostało zadeklarowane „gdzie indziej”; tzn. w innym kontekście niż to, w którym niejawnie powiedziałeś kompilatorowi, aby szukał. (Inna klasa? Inny zakres? Inny pakiet? Inna baza kodu?)
  • W przypadku identyfikatorów, które powinny odnosić się do zmiennych:
    • Być może zapomniałeś zadeklarować zmienną.
    • Być może deklaracja zmiennej jest poza zakresem w punkcie, w którym próbujesz jej użyć. (Patrz przykład poniżej)
  • W przypadku identyfikatorów, które powinny być nazwami metod lub pól:

    • Być może próbujesz odwołać się do odziedziczonej metody lub pola, które nie zostało zadeklarowane w klasach lub interfejsach nadrzędnych / przodków.
    • Być może próbujesz odwołać się do metody lub pola, które nie istnieją (tj. Nie zostały zadeklarowane) w typie, którego używasz; np . "someString".push()2 .
    • Być może próbujesz użyć metody jako pola lub odwrotnie; np . "someString".lengthlub someArray.length().
    • Być może omyłkowo operujesz na tablicy, a nie na elemencie tablicy; na przykład

      String strings[] = ...
      if (strings.charAt(3)) { ... }
      // maybe that should be 'strings[0].charAt(3)'
  • W przypadku identyfikatorów, które powinny być nazwami klas:

    • Być może zapomniałeś zaimportować klasę.
    • Być może użyłeś importu „star”, ale klasa nie jest zdefiniowana w żadnym z zaimportowanych pakietów.
    • Być może zapomniałeś new:

      String s = String();  // should be 'new String()'
  • W przypadkach, gdy typ lub instancja nie wydaje się mieć członka, którego się spodziewałeś, że ma:

    • Być może zadeklarowałeś zagnieżdżoną klasę lub parametr ogólny, który zaciemnia typ, którego zamierzałeś użyć.
    • Być może przesłaniasz zmienną statyczną lub instancję.
    • Być może zaimportowałeś zły typ; np. z powodu zakończenia IDE lub autokorekty.
    • Być może używasz (kompilujesz przeciwko) niewłaściwej wersji interfejsu API.
    • Być może zapomniałeś rzucić obiekt na odpowiednią podklasę.

Problem jest często kombinacją powyższych. Na przykład może „zaimportowałeś” gwiazdkę, java.io.*a następnie próbowałeś użyć Filesklasy ... której java.nionie ma java.io. A może chciałeś napisać File... w której jest klasa java.io.


Oto przykład, w jaki sposób niepoprawne określanie zakresu zmiennych może prowadzić do błędu „Nie można znaleźć symbolu”:

List<String> strings = ...

for (int i = 0; i < strings.size(); i++) {
    if (strings.get(i).equalsIgnoreCase("fnord")) {
        break;
    }
}
if (i < strings.size()) {
    ...
}

To spowoduje błąd „Nie można znaleźć symbolu” iw ifinstrukcji. Choć wcześniej oświadczył i, że deklaracja jest tylko w zakresie do forrachunku i jego ciała. Odwołanie iw ifoświadczeniu nie widzi tej deklaracji i. To jest poza zakresem .

(Odpowiednią poprawką może być tutaj przeniesienie ifinstrukcji do pętli lub zadeklarowanie iprzed rozpoczęciem pętli).


Oto przykład, który powoduje zdziwienie, w którym literówka prowadzi do pozornie niewytłumaczalnego błędu „Nie można znaleźć symbolu”:

for (int i = 0; i < 100; i++); {
    System.out.println("i is " + i);
}

Spowoduje to błąd kompilacji w printlnwywołaniu, mówiąc, że inie można go znaleźć. Ale (słyszę, jak mówisz) ogłosiłem to!

Problemem jest sprytny średnik ( ;) przed {. Składnia języka Java definiuje w tym kontekście średnik jako pustą instrukcję . Pusta instrukcja staje się wówczas ciałem forpętli. Ten kod w rzeczywistości oznacza to:

for (int i = 0; i < 100; i++); 

// The previous and following are separate statements!!

{
    System.out.println("i is " + i);
}

{ ... }Blok nie jest ciało forpętli, a więc poprzednia deklaracja iw forstwierdzenie jest poza zakresem w bloku.


Oto kolejny przykład błędu „Nie można znaleźć symbolu” spowodowanego literówką.

int tmp = ...
int res = tmp(a + b);

Pomimo wcześniejszego zgłoszenia, tmpw tmp(...)wyrażeniu jest błędna. Kompilator wyszuka metodę o nazwie tmpi jej nie znajdzie. Poprzednio zadeklarowany tmpjest w przestrzeni nazw dla zmiennych, a nie w przestrzeni nazw dla metod.

W przykładzie, z którym się spotkałem, programista faktycznie pominął operatora. Chciał on napisać tak:

int res = tmp * (a + b);

Jest inny powód, dla którego kompilator może nie znaleźć symbolu, jeśli kompilujesz z wiersza poleceń. Być może po prostu zapomniałeś skompilować lub przekompilować inną klasę. Na przykład, jeśli masz klasy Fooi Bargdzie Fooużywa Bar. Jeśli nigdy nie skompilowałeś Bari nie uruchomiłeś javac Foo.java, możesz stwierdzić, że kompilator nie może znaleźć symbolu Bar. Prostą odpowiedzią jest skompilowanie Fooi Barpołączenie; np . javac Foo.java Bar.javalub javac *.java. Lub lepiej nadal używać narzędzia do budowania Java; np. Ant, Maven, Gradle i tak dalej.

Są też inne niejasne przyczyny ... z którymi zajmę się poniżej.

3. Jak naprawić te błędy?

Ogólnie rzecz biorąc, zaczynasz od ustalenia, co spowodowało błąd kompilacji.

  • Spójrz na wiersz w pliku wskazany w komunikacie o błędzie kompilacji.
  • Określ symbol, o którym mówi komunikat o błędzie.
  • Dowiedz się, dlaczego kompilator mówi, że nie może znaleźć symbolu; patrz wyżej!

Następnie pomyśl o tym, co powinien powiedzieć Twój kod. Następnie w końcu zastanawiasz się, jaką korektę musisz wprowadzić w kodzie źródłowym, aby zrobić to, co chcesz.

Pamiętaj, że nie każda „korekta” jest poprawna. Rozważ to:

for (int i = 1; i < 10; i++) {
    for (j = 1; j < 10; j++) {
        ...
    }
}

Załóżmy, że kompilator mówi „Nie można znaleźć symbolu” dla j. Istnieje wiele sposobów na „naprawienie” tego:

  • Mógłbym zmienić wewnętrzny forna for (int j = 1; j < 10; j++)- prawdopodobnie poprawny.
  • Mógłbym dodać deklarację j przed wewnętrzną forpętlą lub zewnętrzną for- być może poprawną.
  • Mógłbym zmienić jsię iw wewnętrzną forpętlę - prawdopodobnie źle!
  • i tak dalej.

Chodzi o to, że musisz zrozumieć, co twój kod próbuje zrobić, aby znaleźć właściwą poprawkę.

4. Niewyraźne przyczyny

Oto kilka przypadków, w których „Nie można znaleźć symbolu” wydaje się niewytłumaczalny ... dopóki nie przyjrzysz się bliżej.

  1. Niepoprawne zależności : jeśli używasz IDE lub narzędzia do budowania, które zarządza ścieżką kompilacji i zależnościami projektu, być może pomyliłeś się z zależnościami; np. pominął zależność lub wybrał niewłaściwą wersję. Jeśli używasz narzędzia kompilacji (Ant, Maven, Gradle itp.), Sprawdź plik kompilacji projektu. Jeśli używasz IDE, sprawdź konfigurację ścieżki kompilacji projektu.

  2. Nie rekompilujesz : Czasami zdarza się, że nowi programiści Java nie rozumieją, jak działa łańcuch narzędzi Java lub nie wdrożyli powtarzalnego „procesu budowania”; np. używając IDE, Ant, Maven, Gradle i tak dalej. W takiej sytuacji programista może gonić za ogonem, szukając iluzorycznego błędu, który jest faktycznie spowodowany niewłaściwą rekompilacją kodu i tym podobne ...

  3. Wcześniejszy problem z kompilacją : Możliwe, że wcześniejsza kompilacja zakończyła się niepowodzeniem w sposób, który dał plik JAR z brakującymi klasami. Taka awaria byłaby zwykle zauważalna, gdybyś używał narzędzia do kompilacji. Jednak jeśli otrzymujesz pliki JAR od kogoś innego, jesteś zależny od ich poprawnego budowania i zauważania błędów. Jeśli podejrzewasz to, użyj, tar -tvfaby wyświetlić listę podejrzanego pliku JAR.

  4. Problemy z IDE : ludzie zgłaszali przypadki, w których ich IDE jest mylone, a kompilator w IDE nie może znaleźć klasy, która istnieje ... lub odwrotnie.

    • Może się to zdarzyć, jeśli IDE zostało skonfigurowane z niewłaściwą wersją JDK.

    • Może się to zdarzyć, jeśli pamięci podręczne IDE nie zsynchronizują się z systemem plików. Istnieją specyficzne sposoby rozwiązania tego problemu przez IDE.

    • Może to być błąd IDE. Na przykład @Joel Costigliola opisuje scenariusz, w którym Eclipse nie obsługuje poprawnie drzewa „testowego” Mavena: zobacz tę odpowiedź .

  5. Problemy z Androidem : Gdy programujesz dla Androida i występują błędy „Nie można znaleźć symbolu” R, pamiętaj, że Rsymbole są zdefiniowane w context.xmlpliku. Sprawdź, czy context.xmlplik jest poprawny i we właściwym miejscu oraz czy odpowiedni Rplik klasy został wygenerowany / skompilowany. Zauważ, że w symbolach Java rozróżniana jest wielkość liter, więc w odpowiednich identyfikatorach XML rozróżniana jest również wielkość liter.

    Inne błędy symboli w Androidzie prawdopodobnie wynikają z wcześniej wymienionych przyczyn; np. brakujące lub niepoprawne zależności, niepoprawne nazwy pakietów, metody lub pola, które nie istnieją w określonej wersji interfejsu API, błędy w pisowni / pisaniu itd.

  6. Przedefiniowanie klas systemowych : Widziałem przypadki, w których kompilator narzeka, że substringjest to nieznany symbol w czymś takim, jak poniżej

    String s = ...
    String s1 = s.substring(1);

    Okazało się, że programista stworzył własną wersję Stringi że jego wersja klasy nie zdefiniowała substringmetod.

    Lekcja: Nie definiuj własnych klas o takich samych nazwach jak wspólne klasy biblioteczne!

  7. Homoglyphs: Jeśli używasz kodowania UTF-8 dla swoich plików źródłowych, możliwe jest, że identyfikatory wyglądają tak samo, ale w rzeczywistości są różne, ponieważ zawierają homoglyphy. Zobacz tę stronę, aby uzyskać więcej informacji.

    Można tego uniknąć, ograniczając się do ASCII lub Latin-1 jako kodowania pliku źródłowego i używając \uxxxxznaków zmiany znaczenia Java dla innych znaków.


1 - Jeśli przypadkiem, to nie patrz w ten wyjątek czasu wykonywania lub komunikat o błędzie, a następnie albo skonfigurowaniu IDE do wykonywania kodu z błędami kompilacji, czy aplikacja jest generowanie kodu i kompilacji .. przy starcie.

2 - Trzy podstawowe zasady inżynierii lądowej: woda nie płynie pod górę, deska jest silniejsza na boku i nie można naciskać na sznurek .


Miałem inną sytuację, w której wystąpił ten błąd kompilacji, gdy zaćmienie nie widziało problemu: Dwie klasy z zależnościami zdefiniowane odpowiednio w innej klasie. W moim przypadku miałem wyliczenie, implementujące interfejs zdefiniowane w klasie, w której głupio już użyłem wyliczenia.
Jogi

Trochę podobnie do powyższego komentarza, kiedy kompiluję i uruchamiam program z Eclipse, to nie działa. Kompilowanie go z konsoli wywołuje wiele błędów „Nie można znaleźć symbolu”, często związanych z ostatnim elementem w imporcie. Nie mam pojęcia, co to powoduje, ponieważ w kodzie naprawdę nie ma nic złego.
Andres Stadelmann

Innym problemem jest to, że środowiska IDE mogą „interpretować” inne błędy w tej kategorii. Na przykład printlnw System.out.printlnrazie umieszczone na poziomie klasy ramach standardowego kompilatora dałoby nam <identifier> expected( demo ), ale w IntelliJ ujrzymy Cannot resolve symbol 'println'( demo ).
Pshemo

Łał. Nazwałbym to błędem kompilatora.
Stephen C

23

Ten błąd również pojawi się, jeśli zapomnisz new:

String s = String();

przeciw

String s = new String();

ponieważ wywołanie bez newsłowa kluczowego będzie szukało metody (lokalnej) wywołanej Stringbez argumentów - a sygnatura tej metody prawdopodobnie nie jest zdefiniowana.


14

Jeszcze jeden przykład „Zmienna jest poza zakresem”

Jak już kilka razy widziałem tego rodzaju pytania, może jeszcze jeden przykład tego, co jest nielegalne, nawet jeśli mogłoby się wydawać porządku.

Rozważ ten kod:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

To jest nieprawidłowy kod. Ponieważ żadna z wymienionych zmiennych nie messagejest widoczna poza ich odpowiednim zakresem - {}w tym przypadku byłyby to otaczające nawiasy .

Możesz powiedzieć: „Ale zmienna o nazwie wiadomość jest definiowana w obie strony - więc wiadomość jest definiowana poif ”.

Ale mylisz się.

Java nie ma free()lubdelete operatorów , więc musi polegać na śledzeniu zakresu zmiennych, aby dowiedzieć się, kiedy zmienne nie są już używane (wraz z odniesieniami do tych zmiennych przyczyny).

Jest to szczególnie złe, jeśli uważasz, że zrobiłeś coś dobrego. Widziałem tego rodzaju błąd po „zoptymalizowaniu” kodu w następujący sposób:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

„Och, jest zduplikowany kod, wyciągnijmy tę wspólną linię” -> i gotowe.

Najczęstszym sposobem radzenia sobie z tego rodzaju problemami z zakresem jest wstępne przypisanie wartości else do nazw zmiennych w zakresie zewnętrznym, a następnie ponowne przypisanie, jeśli:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);

4
„Java nie ma operatorów free () ani delete, więc musi polegać na śledzeniu zakresu zmiennych, aby dowiedzieć się, kiedy zmienne nie są już używane (wraz z odniesieniami do tych zmiennych przyczyny).” - Chociaż prawda, nie dotyczy. C i C ++ mają odpowiednio operatory free / delete, a jednak równoważny kod C / C ++ do twoich przykładów byłby nielegalny. Bloki C i C ++ ograniczają zakres zmiennych tak jak w Javie. W rzeczywistości dotyczy to większości języków o strukturze blokowej.
Stephen C

1
Lepszym rozwiązaniem dla kodu, który przypisuje inną wartość w każdej gałęzi, jest użycie pustejfinal deklaracji zmiennej.
Daniel Pryden

10

Jednym ze sposobów uzyskania tego błędu w środowisku Eclipse:

  1. Zdefiniuj klasę Aw src/test/java.
  2. Zdefiniowanie innej klasy Bw src/main/javatej klasie zastosowań A.

Wynik: Eclipse skompiluje kod, ale maven wyświetli komunikat „Cannot find symbol”.

Podstawowa przyczyna: Eclipse używa połączonej ścieżki kompilacji dla drzewa głównego i drzewa testowego. Niestety nie obsługuje używania różnych ścieżek kompilacji dla różnych części projektu Eclipse, czego wymaga Maven.

Rozwiązanie :

  1. Nie definiuj w ten sposób swoich zależności; tzn. nie popełniaj tego błędu.
  2. Regularnie buduj swoją bazę kodu za pomocą Maven, aby wcześnie wykryć ten błąd. Jednym ze sposobów jest skorzystanie z serwera CI.

Jakie jest rozwiązanie tego problemu?

2
cokolwiek użyjesz w src / main / java, musisz zdefiniować w src / main / java lub we wszelkich zależnościach kompilacji / środowiska wykonawczego (nie zależności testowych).
Joel Costigliola,

5

„Nie można znaleźć” oznacza, że ​​kompilator, który nie może znaleźć odpowiedniej zmiennej, metody, klasy itp. ... jeśli uzyskasz ten błąd masażu, przede wszystkim chcesz znaleźć wiersz kodu, w którym uzyskasz masę błędów .. A potem w stanie znaleźć zmienną, metodę lub klasę, które nie zostały zdefiniowane przed użyciem. Po potwierdzeniu zainicjuj zmienną, metodę lub klasę, której można użyć w późniejszym czasie ... Rozważ następujący przykład.

Stworzę klasę demo i wydrukuję imię ...

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

Teraz spójrz na wynik ..

wprowadź opis zdjęcia tutaj

Ten błąd mówi: „nazwa zmiennej nie może znaleźć”. Zdefiniowanie i zainicjowanie wartości zmiennej „nazwa” może zostać zniesione przez ten błąd. Właściwie w ten sposób,

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

Teraz spójrz na nowe wyjście ...

wprowadź opis zdjęcia tutaj

Ok Pomyślnie rozwiązałem ten błąd .. Jednocześnie, jeśli możesz dostać coś „nie można znaleźć metody” lub „nie można znaleźć klasy”, najpierw zdefiniuj klasę lub metodę, a po użyciu to ...


3

Jeśli ten błąd pojawia się w kompilacji gdzieś indziej, podczas gdy IDE twierdzi, że wszystko jest w porządku, sprawdź, czy używasz tych samych wersji Java w obu miejscach.

Na przykład Java 7 i Java 8 mają różne interfejsy API, więc wywołanie nieistniejącego interfejsu API w starszej wersji Java spowoduje ten błąd.


2

Ja też otrzymywałem ten błąd. (dla którego przejrzałem Google i zostałem przekierowany na tę stronę)

Problem: Wywołałem metodę statyczną zdefiniowaną w klasie projektu A z klasy zdefiniowanej w innym projekcie B. Otrzymałem następujący błąd:

error: cannot find symbol

Rozwiązanie: Rozwiązałem ten problem, najpierw budując projekt, w którym metoda jest zdefiniowana, a następnie projekt, z którego metoda została wywołana.


Tak, może się tak zdarzyć, jeśli zdecydujesz się przenieść na przykład jakąś funkcję wielokrotnego użytku z bieżącego pakietu do wspólnego pakietu utils, ale wtedy zapomnisz skompilować wspólny pakiet przed wywołaniem funkcji z bieżącego pakietu.
buildingKofi

2

Jeśli ścieżka kompilacji Java Eclipse jest odwzorowana na 7, 8 i we właściwościach projektu pom.xml Maven nazwa java.version jest wymieniona na wyższą wersję Java (9,10,11 itd.) Niż 7,8, musisz zaktualizować w pom. plik XML.

W Eclipse, jeśli Java jest mapowane na Javę w wersji 11, a w pom.xml jest mapowane na Java w wersji 8. Zaktualizuj obsługę Eclipse do Java 11, wykonując poniższe kroki w pomocy Eclipse IDE -> Zainstaluj nowe oprogramowanie ->

Wklej następujący link http://download.eclipse.org/eclipse/updates/4.9-P-builds at Work With

lub

Dodaj (otworzy się okno podręczne) ->

Name:Obsługa Java 11 Location: http://download.eclipse.org/eclipse/updates/4.9-P-builds

następnie zaktualizuj wersję Java we właściwościach Maven pliku pom.xml , jak poniżej

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

Na koniec kliknij prawym przyciskiem myszy projekt Debuguj jako -> Oczyść Maven, kroki kompilacji Maven



1

Mogą istnieć różne scenariusze, jak wspomniano powyżej. Kilka rzeczy, które pomogły mi rozwiązać ten problem.

  1. Jeśli używasz IntelliJ

    File -> 'Invalidate Caches/Restart'

LUB

  1. Klasa, do której się odwoływano, była w innym projekcie i ta zależność nie została dodana do pliku kompilacji Gradle mojego projektu. Dodałem więc zależność za pomocą

    compile project(':anotherProject')

i zadziałało. HTH!


1

skompilowałeś swój kod za pomocą kompilacji maven, a następnie użyłeś testu maven, aby go uruchomić. Teraz, jeśli zmieniłeś coś w kodzie, a następnie bez kompilacji go uruchomisz, pojawi się ten błąd.

Rozwiązanie: Ponownie skompiluj go, a następnie uruchom test. Dla mnie to działało w ten sposób.


1

W moim przypadku - musiałem wykonać poniższe operacje:

  1. Przenieś context.xmlplik z src/java/packagedoresource katalogu (IntelliJ IDE)
  2. Wyczyść targetkatalog.

Przeniesienie pliku bez dbania o referencje może spowodować ten błąd. Już to spotkałem. Po prostu zresetuj w Git i ostrożnie Przesuń ponownie, błąd rozwiązany.
Huy Hóm Hỉnh

0

Aby uzyskać wskazówki, przyjrzyj się bliżej nazwie klasy, która generuje błąd i numer linii, przykład: Błąd kompilacji [BŁĄD] \ application \ xxxxx.java: [44,30] błąd: nie można znaleźć symbolu

Inną przyczyną jest nieobsługiwana metoda wersji java, powiedzmy jdk7 vs 8. Sprawdź% JAVA_HOME%


To tylko mówi to samo, co mówią inne odpowiedzi.
Stephen C,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.