অ্যান্ড্রয়েড স্টুডিও ত্রুটির অর্থ: এনটোটেড নয় প্যারামিটারগুলি @ নননুল প্যারামিটারকে ওভাররাইড করে


104

আমি অ্যান্ড্রয়েড স্টুডিও চেষ্টা করছি। একটি নতুন প্রকল্প তৈরি করার পরে এবং onSaveInstanceStateMyActivity শ্রেণীর তৈরিতে একটি ডিফল্ট পদ্ধতি যুক্ত করার পরে, যখন আমি কোডটি গিটের প্রতিশ্রুতি দেওয়ার চেষ্টা করি, তখন আমি একটি অদ্ভুত ত্রুটি পাই যা আমি বুঝতে পারি না। কোডটি হ'ল:

আমি যে ত্রুটিটি পাই তা হ'ল:

এখানে চিত্র বর্ণনা লিখুন

যদি আমি পদ্ধতিটির স্বাক্ষরটি পরিবর্তনের চেষ্টা করি protected void onSaveInstanceState(@NotNull Bundle outState), তবে আইডিই আমাকে বলে যে এটি প্রতীকটি সমাধান করতে পারে না NotNull

সতর্কতা থেকে মুক্তি পেতে আমার কী করা দরকার?

উত্তর:


124

এটি একটি টীকা, তবে সঠিক নামটি হ'ল NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(এবং যদিও)

import android.support.annotation.NonNull;

উদ্দেশ্যটি হ'ল সংকলককে সতর্ক করার অনুমতি দেওয়া যখন নির্দিষ্ট অনুমানগুলি লঙ্ঘিত হচ্ছে (যেমন কোনও পদ্ধতির প্যারামিটারের সর্বদা একটি মূল্য থাকা উচিত, যদিও এই নির্দিষ্ট ক্ষেত্রে যেমন অন্য কিছু রয়েছে)। থেকে সাপোর্ট টীকা ডকুমেন্টেশন:

@NonNullটীকা নির্দেশ করে একটি প্রদত্ত পরামিতি নাল হতে পারে না ব্যবহার করা যাবে।

যদি কোনও স্থানীয় ভেরিয়েবল নাল হিসাবে পরিচিত হয় (উদাহরণস্বরূপ কারণ কিছু পূর্ববর্তী কোডটি নাল ছিল কিনা তা পরীক্ষা করা হয়েছে), এবং আপনি যে প্যারামিটারটিকে এমন কোনও পদ্ধতিতে পাস করেন যেখানে সেই পরামিতিটি @ ননল হিসাবে চিহ্নিত হয়েছে, আইডিই আপনাকে সতর্ক করবে যে আপনার কাছে রয়েছে একটি সম্ভাব্য ক্রাশ।

এগুলি স্থির বিশ্লেষণের সরঞ্জাম। রানটাইম আচরণটি একেবারেই বদলানো হয় না।


এই ক্ষেত্রে, নির্দিষ্ট সতর্কতা হ'ল আপনি যে মূল পদ্ধতিটি (ওভার Activity) করছেন @NonNullসেগুলি outStateপ্যারামিটারে একটি টীকা রয়েছে , তবে আপনি এটিকে ওভাররাইড পদ্ধতিতে অন্তর্ভুক্ত করেননি। কেবল এটি যুক্ত করার ফলে সমস্যাটি ঠিক হওয়া উচিত ie

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

5
এটা উদ্দেশ্য কি?
ইগোরগানাপলস্কি

2
@ ইগোরগানাপলস্কি দুঃখিত, আমি উল্লেখ করি নি যেহেতু প্রশ্নটি কেবল NotNull/ NonNullপার্থক্য সম্পর্কেই ছিল না । সেই অনুযায়ী সামঞ্জস্য উত্তর।
matiash

2
অন্য কথায়, আইএমএইচও, এই টিকাটি কোনও ফাংশনের অভ্যন্তরে নাল-চেকিংয়ের প্রয়োজনীয়তা সরিয়ে ফেলতে পারে এবং একটি দ্রুত কোড পেতে পারে।
জন প্যাং

1
@ জনপ্যাং আপনি পারতেন , তবে যেহেতু টিকা দ্বারা প্রদত্ত নিষেধাজ্ঞাগুলি বাস্তবে প্রয়োগের গ্যারান্টিযুক্ত নয়, এটি সম্ভবত ভাল ধারণা নয়।
মাটিয়াশ

আমদানি android.support.annotation.NonNull; 2 ঘন্টা এই জিনিসটির সন্ধান করছেন ... নন-নাল কীভাবে আমদানি করবেন তা কেউ উল্লেখ করেনি .. সুতরাং
উচ্চারণ করুন

15

অ্যান্ড্রয়েড সমর্থন লাইব্রেরিতে সম্প্রতি বেশ কয়েকটি দরকারী সমর্থন টীকা যুক্ত করা হয়েছে। তাদের প্রাথমিক ভূমিকাটি বাগগুলি ধরতে সহায়তা করার জন্য বিভিন্ন পদ্ধতি এবং পরামিতিগুলির বৈশিষ্ট্যগুলি বর্নিত করা। উদাহরণস্বরূপ, আপনি যদি টীকা nullসহ চিহ্নিত প্যারামিটারের মানটি পাস করেন তবে আপনি NotNullএকটি সতর্কতা পাবেন।

নীচের নির্ভরতা যুক্ত করে টীকাগুলি আপনার প্রকল্পে গ্রেডলের সাথে যুক্ত করা যেতে পারে:

dependencies {
    compile 'com.android.support:support-annotations:20.0.0'
}

আপনি সতর্কতাটি পাচ্ছেন কারণ Bundleপরামিতিটি @NotNullটীকাগুলির সাথে চিহ্নিত করা হয়েছে এবং পদ্ধতিটি ওভাররাইড করে টীকাটি গোপন হয়ে যায়। সঠিক জিনিসটি হ'ল ওভাররাইডেন পদ্ধতির প্যারামিটারটিতে টীকাকে যুক্ত করা।

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

9

অন্যান্য উত্তরের পাশাপাশি, @NonNull(এবং এটির বিরোধী @Nullable) টীকাগুলি একটি ক্ষেত্র, প্যারামিটার বা পদ্ধতির রিটার্নের ধরণকে টিকা দেয়। ইন্টেলিজ এবং এভাবে অ্যান্ড্রয়েড স্টুডিওগুলি NullPointerExceptionসংকলনের সময়ে আপনাকে সম্ভাব্যতার জন্য সতর্ক করতে পারে ।

একটি উদাহরণ এখানে সেরা:

@NonNull private String myString = "Hello";

@Nullable private String myOtherString = null;

@NonNull 
public Object doStuff() {
    System.out.println(myString.length); // No warning
    System.out.println(doSomething(myString).length); // Warning, the result might be null.

    doSomething(myOtherString); // Warning, myOtherString might be null.

    return myOtherString; // Warning, myOtherString might be null.
}

@Nullable
private String doSomething(@NonNull String a) {
    return a.length > 1 ? null : a; // No warning
}

এই টীকাগুলি রানটাইমের আচরণকে পরিবর্তন করে না (যদিও আমি এটি নিয়ে পরীক্ষা-নিরীক্ষা করেছি ), তবে বাগগুলি প্রতিরোধের একটি সরঞ্জাম হিসাবে পরিবেশন করি।

মনে রাখবেন যে আপনি প্রাপ্ত বার্তাটি একটি ত্রুটি নয়, কেবল একটি সতর্কতা ছিল, যা আপনি যদি চয়ন করেন তবে তা অগ্রাহ্য করা নিরাপদ। বিকল্পটি হ'ল প্যারামিটারটি নিজের মতো করে বোধ করাও যেমন অ্যান্ড্রয়েড স্টুডিওর পরামর্শ দেয়:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.