জাভাচকে "চেক করা বা অনিরাপদ অপারেশনগুলি ব্যবহার করে" সতর্কতা জারি করার কারণ কী?


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>();

জাভা 7 এ আপনি টাইপ ইনফারেন্স ব্যবহার করে জেনেরিক ইনস্ট্যান্টেশনটি সংক্ষিপ্ত করতে পারেন ।

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

জাভা 7-তে, এই সংগ্রহের সাথে টাইপ হস্তক্ষেপ ব্যবহার করেও আমি একই সতর্কতা পেয়েছিলাম :ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
লুসিও

13
@ লুসিও আপনার এখনও কোণ বন্ধনী প্রয়োজন। new ConcurrentHashMap<>()
বিল করুন

3
কেবল উল্লেখ করার জন্য, এটি সংগ্রহগুলি নির্দিষ্ট নয়। আপনি ত্রুটি পেয়েছেন কারণ জাভা সংকলক সাধারণভাবে সুরক্ষা নিশ্চিত করতে পারে না can't উদাহরণস্বরূপ, নিম্নলিখিত কোড সহ একই সতর্কতা উত্পাদিত হয়: অ্যাবস্ট্রাক্টম্যাপ.সিম্পেলএন্ট্রি <স্ট্রিং, স্ট্রিং> এন্ট্রি = নতুন অ্যাবস্ট্রাকম্যাপ.সিম্পেলএন্ট্রি ("হ্যালো", "ওয়ার্ল্ড");
semonte

1
-Xlint:uncheckedসঙ্গে ম্যাভেন
vanduc1102

200

যদি আপনি এটির পরামর্শ অনুযায়ী করেন এবং "-llint: চেক না করা" স্যুইচটি পুনরায় সংকলন করেন, এটি আপনাকে আরও বিশদ তথ্য দেবে।

কাঁচা ধরণের ব্যবহারের পাশাপাশি (অন্যান্য উত্তর দ্বারা বর্ণিত), একটি চেক না করা castালাইও সতর্কতার কারণ হতে পারে।

একবার আপনি XLint- এর সাথে কম্পাইল করে নিলে সতর্কতা এড়াতে আপনার কোডটি পুনরায় কাজ করতে সক্ষম হওয়া উচিত। এটি সর্বদা সম্ভব নয়, বিশেষত যদি আপনি লিগ্যাসি কোডের সাথে সংহত করে যা পরিবর্তন করা যায় না। এই পরিস্থিতিতে আপনি যে স্থানে কোডটি সঠিক তা জানেন যে জায়গায় সতর্কতা দমন করার সিদ্ধান্ত নিতে পারেন:

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

12
আমি আশা করি আরও বেশি লোক এই উত্তরটিকে উচ্চ করে দেবে। আমি টিকটিকির উত্তরটি উত্তর @ নির্বাচন করে আমার পাশে দাঁড়িয়েছি, তবে উত্তরটি আমাকে সতর্কবার্তার মুখেই ডেকেছিল এবং ত্রুটির মুখোমুখি হওয়ার আরও একটি কারণ ব্যাখ্যা করার জন্য আমার হৃদয়ের খুব কাছে রয়েছে।
টুলবার

1
এটাই চূড়ান্ত উত্তর!
রাসেলহফ

এই উত্তরটি সমাধান হিসাবে চিহ্নিত করা উচিত ছিল! ধন্যবাদ!
আলেকজান্ডার ম্যালগিন

19

অ্যান্ড্রয়েড স্টুডিওর জন্য আপনাকে যুক্ত করতে হবে:

allprojects {

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

    // ...
}

আপনার ত্রুটিটি কোথায় উত্পাদিত হয়েছে তা জানতে আপনার প্রকল্পের বিল্ড.gradle ফাইল।


ধন্যবাদ, আমি এটি যোগ করে আমার সতর্কতাটি কোথা থেকে আসছে তা খুঁজে পেয়েছি
জ্যাকআউটাবক্স

আমি এই সতর্কতাটি পেয়েছি এবং এএস এটি তৈরি করেছে এমন একটি শ্রেণি দেখায়। এবং এটি ত্রুটি নয়, কেবল সতর্কতা। কেন আমাদের এই বিকল্পটি যুক্ত করা উচিত? আপনার পরিস্থিতিতে কোনও সমস্যা শ্রেণি প্রদর্শিত হয়নি?
কুলমাইন্ড

হ্যাঁ, আমি কেবল প্রশ্নের উত্তর দিয়েছি, এবং না , আপনি এটি যোগ না করা পর্যন্ত সমস্যাটি প্রদর্শিত হবে না।
বোরঝ

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"
        }
    }

}

আমার প্রকল্পে বিল্ড.gradle ফাইল ( বোরঝ সমাধান )

এবং তারপরে যদি কিছু মেটশেড বাকি থাকে:

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

5

উদাহরণস্বরূপ, আপনি যখন এমন কোনও ফাংশন কল করেন যা জেনেরিক সংগ্রহগুলি ফেরত দেয় এবং আপনি জেনেরিক পরামিতিগুলি নিজেকে নির্দিষ্ট করেন না।

একটি ফাংশন জন্য

List<String> getNames()


List names = obj.getNames();

এই ত্রুটি উত্পন্ন করবে।

এটি সমাধান করার জন্য আপনি কেবল পরামিতি যুক্ত করবেন

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

5

জাভা জেনারিকস যুক্ত করার সময় জাভাগুলি যোগ করার সময় "চেক করা বা অনিরাপদ অপারেশনগুলি" সতর্কতা যুক্ত করা হয়েছিল , যদি আমি সঠিকভাবে মনে করি। এটি সাধারণত আপনাকে একরকম বা অন্য কোনও ধরণের বিষয়ে আরও স্পষ্ট থাকতে বলেছে।

উদাহরণ স্বরূপ. কোডটি ArrayList foo = new ArrayList();সেই সতর্কবার্তাটিকে ট্রিগার করে কারণ জাভ্যাক সন্ধান করছে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>();

ধরণের অ্যারেলিস্টকে অবজেক্ট হিসাবে সেট করা আমাদের যে কোনও ধরণের ডেটা সংরক্ষণ করার সুবিধা দেয়। আপনার -Xlint বা অন্য কিছু ব্যবহার করার দরকার নেই।


0

এই সতর্কতা কারণে উত্থাপিত হতে পারে

নতুন হ্যাশম্যাপ () বা নতুন অ্যারেলিস্ট () যা জেনেরিক টাইপযুক্ত তা নির্দিষ্ট করে রাখতে হবে অন্যথায় সংকলক সতর্কতা উত্পন্ন করবে।

দয়া করে নিশ্চিত হয়ে নিন যে আপনার কোডটিতে নিম্নলিখিতটি থাকলে আপনার সেই অনুযায়ী পরিবর্তন করতে হবে

নতুন হ্যাশম্যাপ () => মানচিত্রের মানচিত্র = নতুন হ্যাশম্যাপ () নতুন হ্যাশম্যাপ () => মানচিত্রের মানচিত্র = নতুন হ্যাশম্যাপ <> ()

নতুন অ্যারেলিস্ট () => তালিকার মানচিত্র = নতুন অ্যারেলিস্ট () নতুন অ্যারেলিস্ট () => তালিকার মানচিত্র = নতুন অ্যারেলিস্ট <> ()


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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.