2016-02-05 34 views
9

Mam mały plik java podany poniżej.Błąd podczas kompilowania w cmd, ale nie w Netbeans

class abc{ 
    public static void main(String args[]){ 
     Object a= 9; 
     int b= (int)a; 
     System.out.print(b); 
    } 
} 

Daje błąd podczas kompilacji w cmd, ale nie w Netbeans. Ponadto, gdy zastępuję "(int) a" with "(Integer) a", kompiluje i działa poprawnie na obu cmd i Netbeans.

class abc{ 
    public static void main(String args[]){ 
     Object a= 9; 
     int b= (Integer)a; 
     System.out.print(b); 
    } 
} 

Jaki jest tego powód i jak mogę to naprawić?

EDIT: Błąd, który pojawia się podczas kompilacji pierwszy kod to:

C:\Users\ANKIT.ANKITSHUBHAM-PC>javac abc.java 
    abc.java:4: inconvertible types 
    found : java.lang.Object 
    required: int 
          int b= (int)a; 
             ^
    1 error 

EDIT: To pytanie nie jest o odlewu. Chodzi o to, dlaczego cmd i Netbeans zachowują się inaczej, gdy rzutuję obiekt na int używając "(int)", ale zachowuję się w taki sam sposób, gdy rzutuje się na "(Integer)".

+0

Czy możesz opublikować błąd. Myślę, że to dlatego, że NetBeans działa inteligentnie i bezpośrednio koryguje twój błąd. – ctst

+1

Możliwy duplikat [Jak przesłać obiekt do int w java?] (Http://stackoverflow.com/questions/3661413/how-to-cast-an-object-to-an-int-in-java) . Poprzedni kod jest ważny tylko w języku Java 7+; Zgaduję, że twoje netbeans używa starszego kompilatora. –

+0

@ctst Wysłałem błąd. –

Odpowiedz

2

Powodem tego było to, że zachowanie obojętny Netbeans używał Java 7, ale cmd jeszcze użyciu Java 6. odlewu przy zastosowaniu „(int)” nie jest dozwolone w Java 6, ale dopuszcza Java 7.

Jak korzystać z Java 7 z cmd? Odpowiedź:

  1. Otwórz 'Mój komputer'
  2. Kliknij zakładkę 'Właściwości systemu' na górze.
  3. Kliknij "Zaawansowane ustawienia systemu" na lewym panelu.
  4. Kliknij przycisk "Zmienne środowiskowe ...".
  5. Będą dwie sekcje; mamy kłopot z tym, który nosi tytuł "Zmienne systemowe"

  6. Wybierz "ŚCIEŻKA" i kliknij przycisk Edytuj.

  7. Dodaj adres javac na java 7. W moim przypadku był to "C: \ Program Files \ Java \ jdk1.7.0_79 \ bin". Zawiera javac.exe
  8. Kliknij OK.

    Teraz spróbuj uruchomić z cmd. Mam nadzieję, że to działa!

0

Dzieje się tak, ponieważ nie można rzutować Object na pierwotny typ danych. W drugim przykładzie kodu w rzeczywistości odlewane jest Object do Integer, a następnie rozpakowywane do pierwotnego int.

9

Co się dzieje tutaj:

Object a= 9; 

jest:

  • int o wartości 9 jest tworzony
  • jest owinięty w Integer za pomocą auto-boxing
  • jest przechowywane w zmienna typu Object

Teraz w następnym wierszu, Object nie może być oddane do intw Javie 6, bo to jest w rzeczywistości Integer, a nie prymitywny typ. Można go jednak przesłać na numer Integer, a następnie automatyczne rozpakowywanie zajmuje się wyodrębnianiem int z tego Integer.


Teraz do "Dlaczego to działa w Netbeans?"

Netbeans używa innego kompilatora (patrz here) niż robi to wiersz poleceń javac. Prawdopodobnie zachowuje się w inny sposób niż javac i jest bardziej tolerancyjny - może automatycznie odszyfrowuje Integer, gdy napotka próbę rzucenia go do int.

Zgodnie z inną odpowiedzią, Java 7 obsługuje automatyczne rozpakowywanie w takich okolicznościach, więc prawdopodobnie powodem jest to, że twój wiersz poleceń javac pochodzi z Java 6, podczas gdy Netbeans używa kompilatora Java 7 (lub nowszego).

+0

Jak mogę użyć kompilatora używanego przez Netbeans w cmd? –

+0

Nie wiem, czy mógłbyś to zrobić, ale nie sądzę, że powinieneś * to zrobić - piszesz mimo wszystko program w języku Java, więc powinien być kompilowany przez standardowy kompilator Java. –

+0

Ale używanie odlewania (int) jest również standardem, bo gdzieś czytałem, że Java 7 pozwala na ten format również poza "(Integer)". –

5

Powiedziałbym, że to ze względu na różne wersje kompilatora (lub poziomów zgodności źródło):

$ javac abc.java -source 1.6 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
abc.java:4: error: incompatible types: Object cannot be converted to int 
     int b= (int)a; 
        ^
1 error 
1 warning 
$ javac abc.java -source 1.8 
$ java abc 
9 

Wydaje się, że była to zmiana dokonana w Javie 7. Zobacz this question i związanych z odpowiedziami.

Patrząc na niektóre z pozostałych odpowiedzi, uważam, że ważne jest podkreślenie, że Twój kod jest idealnie poprawny w kodzie Java 7.

Nie będziesz potrzebować kompilatora NetBeans, powiedziałbym tylko zainstalować Java 8 z witryny Oracle i gotowe. Musisz tylko się martwić, jeśli twój kod musi działać na Javie 6, w przypadku, gdy twój kod będzie musiał być kompatybilny wstecz.

2

Nie można rzutować obiektu na prymitywny typ danych, może NetBeans zrobi to za Ciebie. Jakiej wersji Java używasz do kompilacji w obu środowiskach?