কোটলিন ডাবল-ব্যাং (!!) অপারেটর কী?


177

আমি জাভাকে কোটলিনে অ্যান্ড্রয়েড স্টুডিওতে রূপান্তর করছি। আমি উদাহরণ পরিবর্তনশীল পরে ডাবল ঠুং শব্দ পেতে। ডাবল ব্যাং কী এবং আরও গুরুত্বপূর্ণভাবে এই নথিটি কোথায় রয়েছে?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

উত্তর:


205

এটি অনিরাপদ nullable টাইপ ( T?) একটি নন- নালযোগ্য টাইপ ( ) এ রূপান্তর T, মান হলে !!নিক্ষেপ করবে ।NullPointerExceptionnull

এটি কোটলিন নাল-সুরক্ষার উপায় সহ এখানে নথিভুক্ত করা হয়েছে


1
!!একটি বিবৃতি শেষে যখন এর অর্থ কি ? আইজে আমাকে val price = sale.latest!!
কোটলিনে

7
@ আইকম্প, এর অর্থ এটি sale.latestথাকতে পারে null; অ্যাসাইনমেন্টটি কেবল তখনই সফল হবে যদি sale.latestতা বাতিল হয় না এবং অন্যথায় এনপিই নিক্ষেপ করবে। এটি এর জন্য নাল-সুরক্ষা দেয় val price: এটির ধরণটি শূন্য হবে। দেখুন kotlinlang.org/docs/reference/null-safety.html
হট-

1
@ হটকি: তাহলে এনপিই পাওয়ার - এখানে বা যখন নাল বস্তুতে সর্বশেষ পদ্ধতিটি অ্যাক্সেস করা যায় তখন তার মধ্যে পার্থক্য কী?
আদা

2
@ আডা, একটি এনপিই ডিবাগ করা এবং লাইন / কার্যকরকরণের পথটি সনাক্ত করতে খুব বেশি সমস্যা হয় যা মানটি বাতিল করে দেয়। এই নাল অ্যাসাইনমেন্টটি অন্য কোনও প্রসঙ্গে, শ্রেণি বা এমনকি দিনে ঘটতে পারে! ব্যবহার করে !!আপনি ব্যর্থ-দ্রুত এবং একটি এনপিইর মূল কারণটি সনাক্ত করতে পারেন। আমি চাই জাভাতেও একই বৈশিষ্ট্য রয়েছে (এটি ডাব্লু / ও কুরুচিপূর্ণ ifবিবৃতি এবং / অথবা assertআয়ন)।
ক্যাসকেডার

82

বিষয়গুলি পরিষ্কার করার জন্য এখানে একটি উদাহরণ। বলুন আপনার এই ফাংশন আছে

fun main(args: Array<String>) {
    var email: String
    email = null
    println(email)
}

এটি নিম্নলিখিত সংকলন ত্রুটি উত্পাদন করবে।

Null can not be a value of a non-null type String

এখন আপনি Stringএটিকে প্রবণতাযোগ্য করে তুলতে প্রকারে একটি প্রশ্ন চিহ্ন যুক্ত করে এটি প্রতিরোধ করতে পারেন ।

তাহলে আমাদের আছে

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email)
}

এটি একটি ফলাফল উত্পাদন করে

null

এখন যদি আমরা ইমেলটির মূল্য শূন্য হয় তখন ফাংশনটি একটি ব্যতিক্রম ছুঁড়ে ফেলাতে চাই, আমরা ইমেলের শেষে দুটি উদ্দীপনা যুক্ত করতে পারি। এটার মত

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email!!)
}

এটি একটি নিক্ষেপ করবে KotlinNullPointerException


5
সুতরাং, লোকেরা কেন ব্যবহার করবে '!!' যদিও এটি অনিরাপদ কারণ কোনও অ্যাপ্লিকেশনটি বন্ধ হয়ে যাবে যখন সেই ভেরিয়েবলটি শূন্য হয়?
স্যাম

3
@ ডেভিড আপনি কেবল তখনই এটি ব্যবহার করতে পারবেন যখন আপনি 100% নিশ্চিত হন যে ভেরিয়েবলটি নাল নয় (যেমন আপনি স্পষ্টভাবে এটি পরীক্ষা করেছেন) এবং আপনার অ-পরিবর্তনযোগ্য ভেরিয়েবল দরকার
এফএমকে

7
@ এফএমকে আমি পেয়েছি, ধন্যবাদ! আমি বুঝতে পেরেছি যে ডাবল ব্যাং ব্যবহার করা যায় এটি সম্ভব করার জন্য নুলযোগ্য টাইপের ভেরিয়েবলের মানগুলি নন-অ্যালবামযোগ্য প্রকারের ভেরিয়েবলের মধ্যে যায়, তাই না?
স্যাম

2
@ ডেভিড হ্যাঁ, ঠিক
এফএমকে

10

ডাবল-ব্যাং অপারেটরNullPointerException (বা সংক্ষেপে এনপিই) এর অনুরাগীদের জন্য একটি দুর্দান্ত বিকল্প ।

না নাল কথন অপারেটর !! একটি কোনো মান পরিবর্তন করে অ নাল টাইপ এবং একটি ব্যতিক্রম ছোঁড়ার যদি মান নাল হয়।

val nonNull = a!!.length

সুতরাং আপনি লিখতে পারেন a!!, এবং এটি a( Stringউদাহরণস্বরূপ এখানে একটি ) নন-নাল মান প্রদান করবে বা aশূন্য হলে একটি এনপিই নিক্ষেপ করবে ।

আপনি যদি এনপিই চান, আপনার কাছে এটি থাকতে পারে তবে আপনাকে এটি স্পষ্টভাবে জিজ্ঞাসা করতে হবে। এই অপারেটরটি এমন ক্ষেত্রে ব্যবহার করা উচিত যেখানে বিকাশকারী গ্যারান্টি দিচ্ছেন - মানটি কখনই শূন্য হয় না


2
একটি শিক্ষানবিস হিসাবে জিজ্ঞাসা: আমি কেন কোনও মানকে নন-নাল টাইপে রূপান্তর করতে চাই?
উলফ 359

4
@ ওল্ফ 359 এটি আপনাকে 100% নিশ্চিত হতে দেয় যে এর মান নালার নয়। ( "এটা সাধারণ সমস্যা একটি NPE ডিবাগ এবং একটি কঠিন সময় লাইন / সঞ্চালনের পথ যা নাল মান নির্ধারণ করে লোকেটিং আছে এর এই নাল নিয়োগ একটি ভিন্ন প্রেক্ষাপটে, বর্গ বা এমনকি দিনে ঘটতে পারে।!" Cascader দ্বারা)
হ্রাস কার্যকলাপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.