Javac'ın “denetlenmeyen veya güvenli olmayan işlemler kullanıyor” uyarısı vermesine neden olan şey


291

Örneğin:

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

Dinamik olarak kullanarak bazı sınıflar oluşturuyorum sun.misc.Unsafeve çıktıda bu ipuçlarını veriyor
Davut Gürbüz

Yanıtlar:


392

Bu, tür belirticileri olmayan koleksiyonları (örneğin, Arraylist()yerine ArrayList<String>()) kullanıyorsanız Java 5 ve sonraki sürümlerde ortaya çıkar . Bu, derleyicinin koleksiyonu jenerikler kullanarak tür güvenli bir şekilde kullandığınızı kontrol edemeyeceği anlamına gelir .

Uyarıdan kurtulmak için koleksiyonda ne tür nesneler sakladığınız konusunda net olun. Yani, yerine

List myList = new ArrayList();

kullanım

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

Java 7'de Yazım Çıkarımını kullanarak genel örneklemeyi kısaltabilirsiniz .

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

Java 7'de, bu koleksiyonda Type Interference kullanarak bile aynı uyarıyı aldım :ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
Lucio

13
@ Lucio Hala köşeli ayraçlara ihtiyacınız var. new ConcurrentHashMap<>()
Kertenkele Bill

3
Sadece belirtmek gerekirse, bu koleksiyonlara özgü değildir. Java derleyicisi genel olarak tür güvenliğini sağlayamadığından hatayı alıyorsunuz. Örneğin, aşağıdaki kodla aynı uyarı oluşturulur: AbstractMap.SimpleEntry <String, String> entry = new AbstractMap.SimpleEntry ("hello", "world");
semonte

1
-Xlint:uncheckedile MAVEN
vanduc1102

200

Önerisini yapar ve "-Xlint: unchecked" anahtarıyla yeniden derlerseniz, size daha ayrıntılı bilgi verir.

Ham türlerin kullanımının yanı sıra (diğer cevaplarda açıklandığı gibi), kontrol edilmemiş bir döküm de uyarıya neden olabilir.

-Xlint ile derledikten sonra, uyarıyı önlemek için kodunuzu yeniden çalışabilmeniz gerekir. Bu her zaman mümkün değildir, özellikle değiştirilemeyen eski kodlarla entegre ediyorsanız. Bu durumda, kodun doğru olduğunu bildiğiniz yerlerde uyarıyı bastırmaya karar verebilirsiniz:

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

12
Keşke daha fazla insan bu cevabı iptal etsin. @ Kertenkele'nin cevabını seçmemin yanında duruyorum, ancak bu cevap, cevabın bana uyarının tam yüzüne baktığını ve hatayla karşılaşmanın başka bir nedenini ortaya koyduğunu göstermek için kalbime yakın.
araç çubuğu

1
Bu nihai cevap!
russellhoff

Bu cevap çözüm olarak işaretlenmiş olmalı! Teşekkürler!
Alexander Malygin

19

Android Studio için şunları eklemeniz gerekir:

allprojects {

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

    // ...
}

projenizin build.gradle dosyasında bu hatanın nerede üretildiğini bilmek.


teşekkürler, bu ekleyerek benim uyarı geliyor nereden bulundu
JackOuttaBox

Bu uyarıyı alıyorum ve AS ürettiği yerde bir sınıf gösteriyor. Ve bu bir hata değil, sadece uyarı. Bu seçeneği neden eklemeliyiz? Durumunuzda bir sorun sınıfı gösterilmedi mi?
CoolMind

Lol, sadece soruyu cevaplıyorum ve hayır , siz bunu ekleyinceye kadar sorun gösterilmiyor.
Borzh

16

Bu uyarı, kodunuzun ham türde çalıştığı, örneği

-Xlint:unchecked 

detayları almak için

bunun gibi:

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 buradan bahsediyor: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html


1
Bence öyle. Bu tam uyarı için Oracle belgelerine bağlanır.
Nick Westgate

6

2 yaşında derslerim ve yeni derslerim vardı. Android Studio'da şu şekilde çözdüm:

allprojects {

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

}

Projemde build.gradle dosyası ( Borzh çözümü )

Ve sonra bazı Metheds kaldıysa:

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

5

örneğin, Genel Koleksiyonlar döndüren bir işlevi çağırdığınızda ve genel parametreleri kendiniz belirtmediğinizde.

bir işlev için

List<String> getNames()


List names = obj.getNames();

bu hatayı oluşturur.

Bunu çözmek için sadece parametreleri eklersiniz

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

5

Java, Generics eklediğinde , doğru şekilde hatırlamıyorsam "denetlenmeyen veya güvenli olmayan işlemler" uyarısı eklendi . Genellikle türler hakkında bir şekilde daha açık olmanızı ister.

Örneğin. ArrayList foo = new ArrayList();javac aradığı için kod bu uyarıyı tetiklerArrayList<String> foo = new ArrayList<String>();


2

Sadece sık sık gördüğüm kontrolsüz uyarı türüne bir örnek eklemek istiyorum. Serializable gibi bir arabirim uygulayan sınıflar kullanıyorsanız, genellikle gerçek sınıfı değil, arabirimin nesnelerini döndüren yöntemleri çağırırsınız. Döndürülen sınıfın jeneriklere dayalı bir türe verilmesi gerekiyorsa, bu uyarıyı alabilirsiniz.

Göstermek için kısa (ve biraz saçma) bir örnek:

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 (), Serializable uygulayan bir nesne döndürür. Bu, gerçek türe dönüştürülmelidir, ancak bu işaretlenmemiş bir dökümdür.


0

Solüsyon belirli tip kullanmak olacaktır <>gibi ArrayList<File>.

misal:

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

Yukarıdaki kod ArrayListbelirli türde olmadığından uyarı oluşturur .

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

Yukarıdaki kod iyi olacak. Yalnızca değişiklik sonraki üçüncü satırda olur ArrayList.


0

Genel formda tutabilir ve şu şekilde yazabilirsiniz:

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

ArrayList türünün Nesne olarak ayarlanması bize her türlü veriyi depolama avantajı sağlar. -Xlint ya da başka bir şey kullanmanıza gerek yoktur.


0

Bu uyarı ayrıca

yeni HashMap () veya genel tür olan yeni ArrayList () özel olmalıdır, aksi takdirde derleyici uyarı oluşturur.

Lütfen aşağıdakileri kodlarsanız buna göre değiştirmeniz gerektiğinden emin olun

yeni HashMap () => Harita haritası = yeni HashMap () yeni HashMap () => Harita haritası = yeni HashMap <> ()

new ArrayList () => Liste haritası = yeni ArrayList () new ArrayList () => Liste haritası = yeni ArrayList <> ()


0

Ben var ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Çünkü valuekarmaşık bir yapı (I istediğim temiz JSON ), sayılar, Boolean, dizeleri, diziler üzerinde herhangi kombinasyonları var olabilir. Bu yüzden @ Dan Dyer'ın çözümünü kullandım:

@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.