web-dev-qa-db-fra.com

Qu'est-ce qui a poussé javac à émettre l'avertissement "utilise des opérations non contrôlées ou non sécurisées"

Par exemple:

javac Foo.Java
Note: Foo.Java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
263
toolbear

Cela se produit dans Java 5 et versions ultérieures si vous utilisez des collections sans spécificateurs de type (par exemple, Arraylist() au lieu de ArrayList<String>()). Cela signifie que le compilateur ne peut pas vérifier que vous utilisez la collection de manière sécurisée, en utilisant génériques .

Pour vous débarrasser de l'avertissement, précisez le type d'objets que vous stockez dans la collection. Donc, au lieu de

List myList = new ArrayList();

utilisation

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

Dans Java 7, vous pouvez réduire l'instanciation générique à l'aide de Type Inference .

List<String> myList = new ArrayList<>();
363
Bill the Lizard

Si vous faites ce que cela suggère et que vous recompilez avec le commutateur "-Xlint: unchecked", il vous donnera des informations plus détaillées.

Outre l'utilisation de types bruts (comme décrit dans les autres réponses), une distribution non contrôlée peut également provoquer l'avertissement.

Une fois que vous avez compilé avec -Xlint, vous devriez pouvoir retravailler votre code pour éviter l'avertissement. Ce n'est pas toujours possible, en particulier si vous intégrez du code hérité qui ne peut pas être modifié. Dans cette situation, vous pouvez décider de supprimer l'avertissement dans les endroits où vous savez que le code est correct:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
183
Dan Dyer

Cet avertissement signifie que votre code fonctionne sur un type brut, recompilez l'exemple avec le

-Xlint:unchecked 

pour obtenir les détails

comme ça:

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 en parle ici: http://docs.Oracle.com/javase/tutorial/Java/generics/rawTypes.html

Pour Android Studio, vous devez ajouter:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}

dans le fichier build.gradle de votre projet pour savoir où cette erreur est produite.

12
Borzh

par exemple, lorsque vous appelez une fonction qui renvoie des collections génériques sans spécifier vous-même les paramètres génériques.

pour une fonction

List<String> getNames()


List names = obj.getNames();

va générer cette erreur.

Pour le résoudre, il vous suffit d'ajouter les paramètres

List<String> names = obj.getNames();
5
Matt

L'avertissement "opérations non contrôlées ou non sécurisées" a été ajouté lorsque Java a été ajouté Generics , si mes souvenirs sont exacts. Il vous demande généralement d'être plus explicite sur les types, d'une manière ou d'une autre.

Par exemple. le code ArrayList foo = new ArrayList(); déclenche cet avertissement car javac recherche ArrayList<String> foo = new ArrayList<String>();

5
Ryan

Je veux juste ajouter un exemple du type d'avertissement non vérifié que je vois assez souvent. Si vous utilisez des classes qui implémentent une interface telle que Serializable, vous appelez souvent des méthodes renvoyant des objets de l'interface, et non la classe réelle. Si la classe renvoyée doit être convertie en un type basé sur des génériques, vous pouvez obtenir cet avertissement.

Voici un exemple bref (et un peu ridicule) à démontrer:

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 () retourne un objet qui implémente Serializable. Cela doit être converti dans le type réel, mais il s'agit d'une distribution non contrôlée.

2
Michael Levy

Vous pouvez le conserver sous la forme générique et l'écrire comme suit:

// list 2 is made generic and can store any type of Object
        ArrayList<Object> list2 = new ArrayList<Object>();

Définir le type de ArrayList en tant qu’objet nous donne l’avantage de stocker tout type de données. Vous n'avez pas besoin d'utiliser -Xlint ou quoi que ce soit d'autre.

0
Mayukh Datta

La solution serait d'utiliser un type spécifique dans <> comme ArrayList<File>.

exemple:

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

le code ci-dessus génère un avertissement car ArrayList n'est pas d'un type spécifique.

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

le code ci-dessus fera l'affaire. Seul le changement se trouve à la troisième ligne après ArrayList.

0
Julius