Co powoduje, że javac wydaje ostrzeżenie "używa operacji niezaznaczonych lub niebezpiecznych"

Na przykład:

javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Author: Eric Leschinski, 2008-10-13

7 answers

Pojawia się to w Javie 5 i później, jeśli używasz kolekcji bez specyfikacji typu (np. Arraylist() zamiast ArrayList<String>()). Oznacza to, że kompilator nie może sprawdzić, czy używasz kolekcji w sposób bezpieczny dla typu, używając generics .

Aby pozbyć się ostrzeżenia, po prostu sprecyzuj, jakiego typu obiekty przechowujesz w kolekcji. Więc zamiast

List myList = new ArrayList();

Użycie

List<String> myList = new ArrayList<String>();

W Javie 7 można skrócić instancję generyczną używając typu Wnioskowanie .

List<String> myList = new ArrayList<>();
 317
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-29 14:57:51

Jeśli zrobisz to, co sugeruje i przekompilujesz za pomocą przełącznika "-Xlint:unchecked", da ci to bardziej szczegółowe informacje.

Jak również użycie typów surowych (jak opisano w innych odpowiedziach), niezaznaczony odlew może również spowodować Ostrzeżenie.

Po skompilowaniu z-Xlint, powinieneś być w stanie przerobić kod, aby uniknąć ostrzeżenia. Nie zawsze jest to możliwe, szczególnie jeśli integrujesz się ze starszym kodem, którego nie można zmienić. W takiej sytuacji możesz zdecyduj się na wyłączenie ostrzeżenia w miejscach, w których wiesz, że kod jest poprawny:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
 168
Author: Dan Dyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 15:48:36

To Ostrzeżenie oznacza, że Twój kod działa na surowym typie, przekompiluj przykład za pomocą

-Xlint:unchecked 

Aby uzyskać szczegóły

TAK:

javac YourFile.java -Xlint:unchecked

Main.java:7: warning: [unchecked] unchecked cast
        clone.mylist = (ArrayList<String>)this.mylist.clone();
                                                           ^
  required: ArrayList<String>
  found:    Object
1 warning

Docs.oracle.com rozmowy o tym tutaj: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

 14
Author: Suganthan Madhavan Pillai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 20:32:19

Na przykład, gdy wywołujesz funkcję, która zwraca zbiory generyczne i nie określasz parametrów generycznych.

Dla funkcji

List<String> getNames()


List names = obj.getNames();

Wygeneruje ten błąd.

Aby go rozwiązać wystarczy dodać parametry

List<String> names = obj.getNames();
 5
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 15:31:37

Ostrzeżenie "unchecked or unsafe operations" zostało dodane, gdy java dodała Generics , o ile dobrze pamiętam. Zazwyczaj prosi Cię o bardziej wyraźne określenie typów, w taki czy inny sposób.

Na przykład. kod ArrayList foo = new ArrayList(); uruchamia to Ostrzeżenie, ponieważ javac szuka ArrayList<String> foo = new ArrayList<String>();
 5
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 02:54:48

Chcę tylko dodać jeden przykład tego rodzaju niekontrolowanego ostrzeżenia, które widzę dość często. Jeśli używasz klas, które implementują interfejs, taki jak Serializable, często wywołasz metody, które zwracają obiekty interfejsu, a nie rzeczywistą klasę. Jeśli zwracana klasa musi Zostać oddana do typu opartego na generykach, możesz otrzymać to Ostrzeżenie.

Oto krótki (i nieco głupi) przykład do zademonstrowania:

import java.io.Serializable;

public class SimpleGenericClass<T> implements Serializable {

    public Serializable getInstance() {
        return this;
    }

    // @SuppressWarnings("unchecked")
    public static void main() {

        SimpleGenericClass<String> original = new SimpleGenericClass<String>();

        //  java: unchecked cast
        //    required: SimpleGenericClass<java.lang.String>
        //    found:    java.io.Serializable
        SimpleGenericClass<String> returned =
                (SimpleGenericClass<String>) original.getInstance();
    }
}

GetInstance () zwraca obiekt implementujący Serializowalny. To musi być rzucone do rzeczywistego typu, ale to jest niezaznaczony odlew.

 2
Author: Michael Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 22:12:12

Rozwiązaniem byłoby użycie określonego typu w <> Jak ArrayList<File>.

Przykład:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);

Powyższy kod generuje ostrzeżenie, ponieważ {[4] } nie jest określonego typu.

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);

Powyższy kod wystarczy. Tylko zmiana jest w trzeciej linii po ArrayList.

 0
Author: Julius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 17:03:10