क्या "अनियंत्रित या असुरक्षित संचालन" चेतावनी जारी करने के लिए javac का कारण बनता है


291

उदाहरण के लिए:

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

मैं गतिशील रूप से कुछ वर्गों का उपयोग कर रहा हूं sun.misc.Unsafeऔर यह आउटपुट पर ये संकेत दे रहा है
डेवुत गार्बुज़

जवाबों:


392

यह जावा 5 में आता है और बाद में यदि आप बिना टाइपर्स के संग्रह का उपयोग कर रहे हैं (उदाहरण के लिए, Arraylist()इसके बजाय ArrayList<String>())। इसका मतलब है कि संकलक यह नहीं जांच सकता है कि आप संग्रह का उपयोग किस प्रकार से कर रहे हैं, जेनरिक का उपयोग करके ।

चेतावनी से छुटकारा पाने के लिए, बस संग्रह में आप किस प्रकार की वस्तुओं का भंडारण कर रहे हैं, इसके बारे में विशिष्ट होना चाहिए। तो, के बजाय

List myList = new ArrayList();

उपयोग

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

Java 7 में आप Type Inference का उपयोग करके सामान्य तात्कालिकता को छोटा कर सकते हैं ।

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

जावा 7 में, मुझे इस संग्रह के साथ टाइप इंटरफेरेंस का उपयोग करने पर भी समान चेतावनी मिली :ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
लूसियो

13
@ ल्यूसीओ आपको अभी भी कोण कोष्ठक की आवश्यकता है। new ConcurrentHashMap<>()
छिपकली

3
केवल इंगित करने के लिए, यह विशिष्ट संग्रह नहीं है। आपको त्रुटि मिलती है क्योंकि जावा कंपाइलर सामान्य रूप से सुरक्षा सुनिश्चित नहीं कर सकता है। उदाहरण के लिए, एक ही चेतावनी निम्नलिखित कोड के साथ निर्मित होती है: AbstractMap.SimpleEntry <स्ट्रिंग, स्ट्रिंग> प्रविष्टि = नया AbstractMap.SimpleEntry ("हैलो", "दुनिया");
सेमों

1
-Xlint:uncheckedMAVEN के
vanduc1102

200

यदि आप ऐसा करते हैं तो यह सुझाव देता है और "-Xlint: अनियंत्रित" स्विच के साथ फिर से मिलाएं, यह आपको अधिक विस्तृत जानकारी देगा।

कच्चे प्रकारों के उपयोग के साथ (जैसा कि अन्य उत्तरों द्वारा वर्णित है), एक अनियंत्रित कास्ट भी चेतावनी का कारण बन सकता है।

एक बार जब आप -Xlint के साथ संकलित हो जाते हैं, तो आपको चेतावनी से बचने के लिए अपने कोड को फिर से काम करने में सक्षम होना चाहिए। यह हमेशा संभव नहीं है, खासकर यदि आप विरासत कोड के साथ एकीकरण कर रहे हैं जिसे बदला नहीं जा सकता है। इस स्थिति में, आप उन स्थानों पर चेतावनी को दबाने का निर्णय ले सकते हैं जहाँ आपको पता है कि कोड सही है:

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

12
काश और लोग इस उत्तर को बढ़ाते। मैं छिपकली के जवाब के अपने चयन के साथ खड़ा हूं, लेकिन यह जवाब मुझे दिखाने के लिए मेरे दिल के करीब है कि जवाब मुझे चेतावनी में खुद को सही में घूर रहा था और साथ ही साथ त्रुटि का सामना करने के लिए एक और कारण भी बता रहा था।
टूलबियर २१'११

1
यह परम उत्तर है!
रसेलहॉफ 15

इस उत्तर को समाधान के रूप में चिह्नित किया जाना चाहिए था! धन्यवाद!
अलेक्जेंडर मैलिगिन

19

Android Studio के लिए, आपको जोड़ने की आवश्यकता है:

allprojects {

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

    // ...
}

अपनी परियोजना की build.gradle फ़ाइल में यह जानने के लिए कि यह त्रुटि कहाँ उत्पन्न हुई है।


धन्यवाद, मैंने पाया कि मेरी चेतावनी यह जोड़कर कहाँ से आ रही है
जैकऑटबॉक्स

मुझे यह चेतावनी मिलती है और एएस एक वर्ग को दिखाता है जहां उसने उत्पादन किया था। और यह त्रुटि नहीं है, सिर्फ चेतावनी है। हमें इस विकल्प को क्यों जोड़ना चाहिए? क्या आपकी स्थिति में समस्या वर्ग नहीं दिखाया गया था?
CoolMind

योग्य, मैं सिर्फ सवाल का जवाब देता हूं, और नहीं , जब तक आप इसे नहीं जोड़ते हैं, तब तक समस्या दिखाई नहीं देती है।
बोरज

16

इस चेतावनी का मतलब है कि आपका कोड एक कच्चे प्रकार पर चल रहा है, उदाहरण के साथ फिर से मिलाएं

-Xlint:unchecked 

विवरण प्राप्त करने के लिए

इस तरह:

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 इसके बारे में यहां बात करता है: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html


1
मुझे लगता है कि यह करता है। वह इस सटीक चेतावनी के लिए ओरेकल दस्तावेज़ से लिंक करता है।
निक वेस्टगेट

6

मेरे पास 2 साल पुरानी कक्षाएं और कुछ नई कक्षाएं थीं। मैंने इसे एंड्रॉइड स्टूडियो में निम्नानुसार हल किया:

allprojects {

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

}

मेरी परियोजना build.gradle फ़ाइल ( Borzh समाधान ) में

और फिर अगर कुछ मेथड बचे हैं:

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

5

उदाहरण के लिए जब आप जेनेरिक कलेक्शंस लौटाते हैं और आप स्वयं जेनरिक मापदंडों को निर्दिष्ट नहीं करते हैं।

एक समारोह के लिए

List<String> getNames()


List names = obj.getNames();

यह त्रुटि उत्पन्न करेगा।

इसे हल करने के लिए आप बस पैरामीटर जोड़ेंगे

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

5

जब जावा कहा, "अनियंत्रित या असुरक्षित संचालन" चेतावनी जोड़ा गया है जेनेरिक्स , अगर मैं सही ढंग से याद है। यह आमतौर पर आपको एक तरह से या किसी अन्य प्रकार के बारे में अधिक स्पष्ट होने के लिए कह रहा है।

उदाहरण के लिए। कोड ArrayList foo = new ArrayList();उस चेतावनी को ट्रिगर करता है क्योंकि javac की तलाश हैArrayList<String> foo = new ArrayList<String>();


2

मैं बस उस तरह की अनियंत्रित चेतावनी का एक उदाहरण जोड़ना चाहता हूं जो मैं अक्सर देखता हूं। यदि आप उन कक्षाओं का उपयोग करते हैं जो एक इंटरफ़ेस को लागू करने वाले सीरियल की तरह हैं, तो अक्सर आप ऐसे तरीकों को कहेंगे जो इंटरफ़ेस की वस्तुओं को लौटाते हैं, न कि वास्तविक वर्ग को। यदि लौटाए जा रहे वर्ग को जेनेरिक के आधार पर टाइप किया जाना चाहिए, तो आपको यह चेतावनी मिल सकती है।

यहाँ एक संक्षिप्त (और कुछ मूर्खतापूर्ण) उदाहरण प्रदर्शित करने के लिए है:

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 () एक ऐसी वस्तु लौटाता है जो सीरियल योग्य बनाता है। यह वास्तविक प्रकार के लिए डाली जानी चाहिए, लेकिन यह एक अनियंत्रित डाली है।


0

समाधान की <>तरह विशिष्ट प्रकार का उपयोग करना होगा ArrayList<File>

उदाहरण:

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

उपरोक्त कोड चेतावनी उत्पन्न करता है क्योंकि ArrayListविशिष्ट प्रकार का नहीं है।

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

उपरोक्त कोड ठीक काम करेगा। केवल परिवर्तन के बाद तीसरी पंक्ति में है ArrayList


0

आप इसे सामान्य रूप में रख सकते हैं और इसे इस प्रकार लिख सकते हैं:

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

ऑब्जेक्ट के रूप में ArrayList का प्रकार सेट करना हमें किसी भी प्रकार के डेटा को संग्रहीत करने का लाभ देता है। आपको -Xlint या किसी और चीज़ का उपयोग करने की आवश्यकता नहीं है।


0

इस चेतावनी के कारण भी उठाया जा सकता है

नया HashMap () या नया ArrayList () जो सामान्य प्रकार है विशिष्ट होना चाहिए अन्यथा संकलक चेतावनी उत्पन्न करेगा।

कृपया सुनिश्चित करें कि यदि आपके पास कोड शामिल है तो आपको उसके अनुसार बदलना होगा

new HashMap () => मैप मैप = नया HashMap () नया HashMap () => मैप मैप = नया HashMap <> ()

नया ArrayList () => सूची मानचित्र = नया ArrayList () नया ArrayList () => सूची मानचित्र = नया ArrayList <> ()


0

मेरे पास है ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;। क्योंकि valueएक जटिल संरचना है (मैं JSON को साफ करना चाहता हूं ), संख्या, बूलियन, स्ट्रिंग्स, सरणियों पर कोई भी संयोजन हो सकता है। इसलिए, मैंने @ डायर के समाधान का उपयोग किया:

@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.