ব্যতিক্রম নিক্ষেপ করার সময় নাল রেফারেন্সগুলি কেন বাতিল করা হয়?


21

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


1
সম্পর্কিত: stackoverflow.com/questions/3989264/...

2
কিছু ভাষাগুলি অন্যদের চেয়ে নালার উপর ক্র্যাশ হয়। একটি "পরিচালিত কোড" যেমন, নেট / জাভা একটি নাল রেফ কেবল অন্য ধরণের সমস্যা, অন্য অন্যান্য নেটিভ কোড সম্ভবত এটিকে নিখুঁতভাবে পরিচালনা করতে পারে না (আপনি কোনও নির্দিষ্ট ভাষার উল্লেখ করেননি)। এমনকি পরিচালিত বিশ্বেও মাঝে মাঝে আপনি ব্যর্থ-নিরাপদ কোড (এম্বেড করা ?, অস্ত্র?) লিখতে চান, এবং কখনও কখনও আপনি জোরে জোরে ASAP (ইউনিট টেস্টিং) করতে চান। উভয় ধরণের কোডই একই লাইব্রেরিতে কল করতে পারে - যা সমস্যা হবে। সাধারণভাবে আমি মনে করি যে কোডগুলি কম্পিউটারের অনুভূতিতে আঘাত না করার চেষ্টা করে এটি একটি খারাপ ধারণা। ব্যর্থ-নিরাপত্তা যাই হোক না কেন হার্ড।
কাজ

@ জোব: এটি অলসতার পক্ষে। আপনি যদি কোনও ব্যতিক্রম পরিচালনা করতে জানেন তবে আপনি এটি পরিচালনা করেন handle কখনও কখনও হ্যান্ডলিং অন্য ব্যতিক্রম নিক্ষেপ জড়িত থাকতে পারে, কিন্তু আপনি কখনই একটি নাল রেফারেন্স ব্যতিক্রম হাতছাড়া না করা উচিত । কখনো। এটি প্রতিটি রক্ষণাবেক্ষণ প্রোগ্রামারের দুঃস্বপ্ন; এটি সম্পূর্ণ গাছের মধ্যে সবচেয়ে অকেজো ব্যতিক্রম। কেবল স্ট্যাক ওভারফ্লো জিজ্ঞাসা করুন
অ্যারোনআউট

বা এটি অন্য কোনও উপায়ে বলতে - ত্রুটি সম্পর্কিত তথ্য উপস্থাপনের জন্য কোনও ধরণের কোড কেন না ফেরানো। এই যুক্তি আগামী বছর ধরে ক্রোধ করবে।
gbjbaanb

উত্তর:


24

নাল রেফারেন্সগুলি ব্যতিক্রম ছাড়া আর "এড়িয়ে চলা" হয় না, কমপক্ষে আমি কখনও পরিচিত বা পড়েছি এমন কারও দ্বারা। আমি মনে করি আপনি প্রচলিত জ্ঞানকে ভুল বুঝছেন।

খারাপটি হ'ল নাল রেফারেন্স (বা একটি নাল পয়েন্টার, ইত্যাদি উপস্থাপনা) অ্যাক্সেস করার চেষ্টা । এটি খারাপ কারণ এটি সবসময় একটি বাগ নির্দেশ করে; আপনি উদ্দেশ্য হিসাবে এই মত কিছু করতে হবে না, এবং আপনি যদি যে এমনকি খারাপ উদ্দেশ্যমূলকভাবে এটা করছেন, তাহলে, কারণ এটি অসম্ভব বগী আচরণ থেকে প্রত্যাশিত আচরণ পার্থক্য তৈরীর।

কিছু নির্দিষ্ট ফ্রিঞ্জ গ্রুপ রয়েছে যারা কোনও কারণে অকার্যকর ধারণাটি সত্যিই ঘৃণা করে, তবে এড উল্লেখ করেছেন যে আপনার যদি না থাকে nullবাnil তারপরে আপনাকে কেবল অন্য কিছু দিয়ে প্রতিস্থাপন করতে হবে, যা কিছু হতে পারে ক্রাশের চেয়ে খারাপ (যেমন ডেটা দুর্নীতি)।

অনেকগুলি কাঠামো প্রকৃতপক্ষে উভয় ধারণা গ্রহণ করে; উদাহরণস্বরূপ, নেট। এ, আপনি যে ঘন ঘন প্যাটার্নটি দেখতে পাবেন তা হ'ল একধরনের পদ্ধতি, যা শব্দের দ্বারা উপস্থাপিত Try(যেমন TryGetValue)। ইন Tryকেস, রেফারেন্স তার ডিফল্ট মান (সাধারণত সেট করা হয় null), এবং অন্যান্য ক্ষেত্রে, একটি ব্যতিক্রম ফেলে দেওয়া হয়। উভয় পদ্ধতির সাথে কোনও ভুল নেই; উভয়ই এমন পরিবেশে ঘন ঘন ব্যবহৃত হয় যা তাদের সমর্থন করে।

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

কোন শব্দার্থকটি ব্যবহার করতে হবে তা নির্ধারণ করা সত্যিই খুব সহজ: কোনও ফাংশনের ফলাফলের অপরিবর্তিত হওয়ার জন্য এটি কোনও অর্থ দেয়? যদি তা হয় তবে আপনি একটি নাল রেফারেন্স ফিরে আসতে পারেন। যদি না হয় তবে একটি ব্যতিক্রম নিক্ষেপ করুন।


5
প্রকৃতপক্ষে এমন ভাষা রয়েছে যেগুলির নাল বা শূন্য হয় না এবং "এটিকে অন্য কিছু দিয়ে প্রতিস্থাপনের প্রয়োজন হয় না"। অযোগ্য রেফারেন্সগুলি বোঝায় যে সেখানে কিছু থাকতে পারে, বা নাও থাকতে পারে। যদি আপনার কেবল ব্যবহারকারীকে স্পষ্টভাবে সেখানে কিছু আছে কিনা তা পরীক্ষা করে দেখার প্রয়োজন হয়, আপনি সমস্যাটি সমাধান করেছেন। বাস্তব জীবনের উদাহরণের জন্য হ্যাশেল দেখুন।
জোহানা লারসন

3
@ এরিক ক্রোনবার্গ, হ্যাঁ, "বিলিয়ন ডলারের ভুল" এবং এই সমস্ত বাজে কথা, লোকেরা এই কুচকাওয়াজকে পর্যালোচনা করে এবং তা তাজা এবং আকর্ষণীয় বলে দাবি করে কখনও শেষ হয় না, এ কারণেই পূর্ববর্তী মন্তব্য থ্রেডটি মোছা হয়েছিল। এই বিপ্লবী প্রতিস্থাপনের লোকেরা কখনই আনতে ব্যর্থ হয় না সর্বদা নাল অবজেক্ট, অপশন বা চুক্তির কিছু বৈকল্পিক, যা প্রকৃতপক্ষে যাদুর অন্তর্গত অন্তর্নিহিত ত্রুটিটি দূর করে না, তারা যথাক্রমে এটিকে স্থগিত করে বা প্রচার করে। যাই হোক, এটা স্পষ্টত ভাষায় যা প্রোগ্রামিং সম্পর্কে একটি প্রশ্ন না আছে null, তাই সত্যিই, Haskell, এখানে চমত্কার অপ্রাসঙ্গিক।
অ্যারোনআট

1
আপনি কি গুরুত্ব সহকারে তর্ক করছেন যে শূন্যতার জন্য কোনও পরীক্ষার প্রয়োজন হয় না, এটি প্রয়োজনীয় হওয়ার মতোই ভাল?
জোহানা লারসন

3
@ এরিক ক্রোনবার্গ: হ্যাঁ, আমি "গুরুত্ব সহকারে তর্ক করছি" যে নাল পরীক্ষা করার জন্য (ক) নাল অবজেক্টের আচরণের চারপাশে একটি অ্যাপ্লিকেশনটির প্রতিটি স্তরের নকশা তৈরি করা, (খ) প্যাটার্ন-ম্যাচ হওয়ার চেয়ে আলাদা নয় different বিকল্পগুলি সর্বদা, বা (গ) কলিকে "আমি জানি না" বলতে অনুমতি দিচ্ছে না এবং একটি ব্যতিক্রম বা ক্র্যাশ চাপিয়ে দিচ্ছে। একটা ব্যাপার কারণ কেন nullএতক্ষণ এত ভাল সহ্য করেছে, এবং যারা অন্যথায় বলতে সংখ্যাগরিষ্ঠ অসম্পূর্ণ প্রয়োজনীয়তা বা পরিণামস্বরূপ দৃঢ়তা মত সীমাবদ্ধতার সঙ্গে সামান্য অভিজ্ঞতা নকশা বাস্তব জগতের অ্যাপ্লিকেশনগুলির সাথে শিক্ষাবিদ বলে মনে হচ্ছে।
অ্যারোনআউট

3
@ অ্যারোনট: কখনও কখনও আমি চাই মন্তব্যগুলির জন্য একটি ডাউনভোট বোতাম ছিল। এরকম বেড়ানোর কোনও কারণ নেই।
মাইকেল শ

11

বড় পার্থক্যটি হ'ল আপনি যদি NULL পরিচালনা করতে কোডটি ছেড়ে যান তবে আপনার কোডটি কিছুটা অবাস্তব ত্রুটি বার্তা সহ পরবর্তী পর্যায়ে সম্ভবত ক্র্যাশ অবিরত থাকবে, যেখানে ব্যতিক্রমগুলি ব্যর্থতার প্রাথমিক পর্যায়ে উত্থাপিত হবে (খোলার মাধ্যমে আপনার উদাহরণে পড়ার জন্য একটি ফাইল)।


4
কোনও NUL হ্যান্ডেল করতে ব্যর্থতা আপনার কোড এবং যা কিছু ফিরে পেয়েছে তার মধ্যে ইন্টারফেস সম্পর্কে ইচ্ছাকৃত অজ্ঞতা হতে পারে। যে বিকাশকারীরা সেই ভুলটি করবে তারা অন্যকে এমন ভাষায় পরিণত করবে যা NUL না করে।
Blrfl

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

@ জোব: আপনার যদি কোনও ডিবাগার না থাকে তবে কী হবে? আপনি কি উপলব্ধি করতে পারেন যে আপনার অ্যাপ্লিকেশনটি রিলিজের পরিবেশে চলতে চলেছে তার 99.99%? যখন এটি ঘটে, আপনি ইচ্ছা করতে যাচ্ছেন যে আপনি আরও অর্থবহ ব্যতিক্রম ব্যবহার করেছেন। আপনার অ্যাপ্লিকেশনটিকে এখনও ব্যর্থ এবং ব্যবহারকারীকে বিরক্ত করতে হতে পারে, তবে কমপক্ষে এটি ডিবাগের তথ্য আউটপুট দেবে যা আপনাকে তাত্ক্ষণিকভাবে সমস্যাটি সন্ধান করতে সক্ষম করবে , এইভাবে ন্যূনতমভাবে বিরক্তি রেখেছিল।
অ্যারোনআট

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

এটি অন্য কোনও উপায়ে বলতে গেলে ব্যতিক্রম বাদে আমাকে স্পষ্টভাবে অস্বাভাবিক কেস পরিচালনা করতে হবে অন্যথায় আমার প্রোগ্রামটি এখনই মারা যায়। নাল রেফারেন্স সহ যদি কোডটি স্পষ্টভাবে অস্বাভাবিক কেসটি পরিচালনা না করে তবে এটি লিঙ্গ করার চেষ্টা করবে। আমি মনে করি এখন ব্যর্থতা কে গ্রহণ করা ভাল।
উইনস্টন এওয়ার্ট

8

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

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

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


শনাক্তকরণের স্ট্রিং সহ একটি অবিশ্রুত সাবক্লাস বিবেচনা করুন এবং এর সমস্ত পদ্ধতি ব্যতিক্রম ছুঁড়ে ফেলে। এর মধ্যে যদি কখনও কখনও দেখা যায় তবে কী হয়েছে তা আপনি জানেন। সীমিত মেমোরি সহ এম্বেড থাকা সিস্টেমে একচেটিয়া ফ্যাক্টরির উত্পাদন সংস্করণটি শূন্য করতে পারে।
জিম বাল্টার

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

1
আপনি nullফেরত মূল্য হিসাবে পেলে কী ঘটেছিল তা আপনিও জানেন : আপনার অনুরোধ করা তথ্য উপস্থিত নেই। কোন পার্থক্য নেই। যে কোনও উপায়ে, কলকারীকে যদি কোনও নির্দিষ্ট উদ্দেশ্যে সেই তথ্যটি ব্যবহার করার প্রয়োজন হয় তবে রিটার্ন মানটি বৈধ করতে হবে। এটি কোনও null, নাল বস্তু, বা একটি মোনাদ বৈধকরণ যাচাই করে ব্যবহারিক কোনও পার্থক্য নেই।
অ্যারোনআট

1
@ জিম বাল্টার: ঠিক আছে, আমি এখনও ব্যবহারিক পার্থক্যটি দেখতে পাচ্ছি না, এবং আমি দেখছি না যে এটি কীভাবে শিক্ষাব্যবস্থার বাইরে প্রকৃত প্রোগ্রাম লেখার পক্ষে জীবনকে সহজ করে তোলে। এর অর্থ এই নয় যে কোনও সুবিধা নেই, কেবলমাত্র তারা আমার কাছে সুস্পষ্ট বলে মনে হয় না।
এড এস।

1
আমি একটি অবিশ্রুত শ্রেণীর সাথে ব্যবহারিক পার্থক্যটি দু'বার ব্যাখ্যা করেছি - এটি নাল আইটেমটির উত্স সনাক্ত করে - নালটির অবচয় দেখা দিলে বাগটি চিহ্নিত করা সম্ভব করে তোলে। নাল-কম দৃষ্টান্তের চারপাশে ডিজাইন করা ভাষাগুলি হিসাবে, তারা সমস্যাটি এড়ানো থেকে বিরত রাখে - তারা প্রোগ্রামের বিকল্প উপায় সরবরাহ করে hat যা অবিচ্ছিন্ন ভেরিয়েবলগুলি এড়ায়; যদি আপনি তাদের সাথে পরিচিত না হন তবে এটি উপলব্ধি করা শক্ত বলে মনে হতে পারে। স্ট্রাকচার্ড প্রোগ্রামিং, যা একটি বিশাল শ্রেণীর বাগগুলি এড়িয়ে যায়, এটিও একসময় "একাডেমিক" হিসাবে বিবেচিত হত।
জিম বাল্টার

5

টনি হোয়ের, যিনি প্রথমে নাল রেফারেন্সের ধারণা তৈরি করেছিলেন, একে একে দশ মিলিয়ন ডলারের ভুল বলেছেন

সমস্যা প্রতি সে-র নাল রেফারেন্স সম্পর্কে নয়, তবে বেশিরভাগ (অন্যথায়) নিরাপদ ভাষা টাইপ করার উপযুক্ত টাইপ-চেকিংয়ের অভাব সম্পর্কে।

ভাষা থেকে এই সমর্থনটির অভাব, এর অর্থ হ'ল বাগগুলি "নাল-বাগগুলি" সনাক্ত হওয়ার আগে প্রোগ্রামটিতে দীর্ঘ সময়ের জন্য লুকিয়ে থাকতে পারে। অবশ্যই বাগের প্রকৃতি এটি অবশ্যই, তবে "নাল-বাগগুলি" এখন এড়ানো যায় বলে পরিচিত।

এই সমস্যাটি বিশেষত সি বা সি ++ তে উপস্থিত রয়েছে (উদাহরণস্বরূপ) "হার্ড" ত্রুটির কারণে এটি ঘটে (প্রোগ্রামটির ক্রাশ, তাত্ক্ষণিকভাবে, কোনও মার্জিত পুনরুদ্ধার ছাড়াই)।

অন্যান্য ভাষায়, কীভাবে তাদের পরিচালনা করবেন তা নিয়ে সর্বদা প্রশ্ন থাকে।

জাভা বা সি # তে আপনি যদি একটি নাল রেফারেন্সে কোনও পদ্ধতিতে প্রার্থনা করার চেষ্টা করেন তবে আপনি ব্যতিক্রম পাবেন এবং এটি ঠিক আছে। এবং তাই জাভা বা সি # প্রোগ্রামারদের বেশিরভাগই এটির জন্য অভ্যস্ত এবং তারা কেন অন্যথায় করতে চায় তা বুঝতে পারে না (এবং সি ++ তে হাসি)।

হাস্কেল-এ, আপনাকে স্পষ্টভাবে নাল মামলার জন্য একটি পদক্ষেপ সরবরাহ করতে হবে, এবং তাই হাস্কেল প্রোগ্রামাররা তাদের সহকর্মীদের নিয়ে দারুণভাবে উদ্বিগ্ন, কারণ তারা এটি সঠিক (সঠিক?) পেয়েছে।

এটি সত্যই, পুরানো ত্রুটি-কোড / ব্যতিক্রম বিতর্ক, তবে এবার ত্রুটি-কোডের পরিবর্তে একটি সেন্টিনেল মান সহ ।

সর্বদা যথাসময়ে যে কোনওটি উপযুক্ত যা পরিস্থিতি এবং শব্দার্থবিজ্ঞানের জন্য আপনি অনুসন্ধান করছেন তার উপর নির্ভর করে।


অবিকল। nullসত্যই এটি মন্দ, কারণ এটি টাইপ সিস্টেমটিকে বিপর্যস্ত করে । (মঞ্জুর, বিকল্পটির কমপক্ষে কিছু ভাষায় তার ভার্বোসটি একটি অপূর্ণতা রয়েছে।)
যান্ত্রিক শামুক

2

আপনি নাল পয়েন্টারের সাথে একটি মানব-পঠনযোগ্য ত্রুটি বার্তা সংযুক্ত করতে পারবেন না।

(তবে আপনি লগ ফাইলে একটি ত্রুটি বার্তা রাখতে পারেন))

কিছু ভাষায় / পরিবেশে যা পয়েন্টার গাণিতিককে মঞ্জুরি দেয়, যদি পয়েন্টারগুলির একটি আর্গুমেন্ট বাতিল হয় এবং এটি গণনাতে অনুমোদিত হয়, ফলাফলটি একটি অবৈধ , নন-নাল পয়েন্টার হতে পারে। (*) আপনাকে আরও শক্তি।

(*) সিওএম প্রোগ্রামিংয়ে এটি অনেক ঘটে , যেখানে আপনি যদি কোনও ইন্টারফেস পদ্ধতিতে কল করার চেষ্টা করেন তবে ইন্টারফেস পয়েন্টারটি শূন্য থাকে, তবে এটি শূন্যের ঠিক বিপরীতে একটি অবৈধ ঠিকানায় কল দেবে।


2

কোনও ত্রুটি সিগন্যাল করতে NULL (বা সংখ্যার শূন্য, বা বুলিয়ান মিথ্যা) ফিরিয়ে দেওয়া প্রযুক্তিগত এবং ধারণাগতভাবে উভয়ই ভুল।

টেকনিক্যালি, আপনি ফেরত মান পরীক্ষণ সঙ্গে প্রোগ্রামার burdening করছি এখুনি , সঠিক বিন্দু যেখানে এটি ফিরিয়ে দেওয়া হয় হয়। আপনি যদি টানা বিশটি ফাইল খোলেন এবং ত্রুটি সংকেতটি NULL ফেরার মাধ্যমে করা হয়, তবে গ্রাহক কোড অবশ্যই প্রতিটি ফাইল পৃথকভাবে পড়তে হবে এবং কোনও লুপ এবং অনুরূপ নির্মাণগুলি ভেঙে ফেলতে হবে। এটি বিশৃঙ্খল কোডের জন্য একটি নিখুঁত রেসিপি। তবে, যদি আপনি কোনও ব্যতিক্রম ছুঁড়ে ত্রুটিটিকে সংকেত দেওয়া বেছে নেন, গ্রাহক কোডটি অবিলম্বে ব্যতিক্রমটি পরিচালনা করতে বেছে নিতে পারে, বা এটি ফাংশন কলগুলিতে এমনকি যথাযথ স্তরগুলিকে বুদবুদ করতে দেয়। এটি অনেক ক্লিনার কোড তৈরি করে।

ধারণামূলকভাবে, আপনি যদি কোনও ফাইল খোলেন এবং কিছু ভুল হয়ে যায়, তবে একটি মান (এমনকি এনওএলএল) ফেরানো ভুল। আপনার ফিরে আসার মতো কিছু নেই, কারণ আপনার অপারেশন শেষ হয়নি। এনআরএল ফিরিয়ে দেওয়া হ'ল "আমি ফাইলটি সফলভাবে পড়েছি এবং এর মধ্যে যা রয়েছে - কিছুই নেই" এর ধারণাগত সমতুল্য। যদি আপনি এটিই প্রকাশ করতে চান (এটি যদি প্রশ্নটির ক্রিয়াকলাপের সত্যিকারের ফলাফল হিসাবে যদি NULL বোঝায়) তবে সমস্ত উপায়ে NULL ফিরিয়ে দিন, তবে আপনি যদি কোনও ত্রুটি সংকেত দিতে চান তবে ব্যতিক্রমগুলি ব্যবহার করুন।

Icallyতিহাসিকভাবে, ত্রুটিগুলি এইভাবে জানানো হয়েছিল কারণ সি এর মতো প্রোগ্রামিং ভাষাগুলির মধ্যে ভাষাতে ব্যতিক্রম হ্যান্ডলিং নেই এবং প্রস্তাবিত উপায় (দীর্ঘ জাম্প ব্যবহার করা) কিছুটা লোমশ এবং এক ধরণের পাল্টা স্বজ্ঞাত।

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


1

ইতিমধ্যে ইঙ্গিত হিসাবে, অনেক ভাষা নাল পয়েন্টার একটি dereferences একটি ক্যাচযোগ্য ব্যতিক্রম রূপান্তর করে না। এটি করা তুলনামূলকভাবে আধুনিক কৌশল। নাল পয়েন্টার ইস্যুটি যখন প্রথম স্বীকৃত হয়েছিল তখন ব্যতিক্রমগুলি এখনও আবিষ্কার করা যায় নি।

আপনি যদি বৈধ কেস হিসাবে নাল পয়েন্টারকে অনুমতি দেন তবে এটি একটি বিশেষ কেস। আপনার বিশেষ-কেস পরিচালনা করার যুক্তি প্রয়োজন, প্রায়শই বিভিন্ন স্থানে। এটি অতিরিক্ত জটিলতা।

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

আরও জটিলতার অর্থ সাধারণত আরও ত্রুটি।

ডেটা স্ট্রাকচারে নাল পয়েন্টার ব্যবহারের বিকল্পগুলির মধ্যে (যেমন কোনও লিঙ্কযুক্ত তালিকার শুরু / শেষ চিহ্নিত করতে) সেন্ডিনেল আইটেমগুলি ব্যবহার করা অন্তর্ভুক্ত। এগুলি অনেক কম জটিলতার সাথে একই কার্যকারিতা দিতে পারে। তবে জটিলতা পরিচালনা করার অন্যান্য উপায়ও থাকতে পারে। একটি উপায় হ'ল একটি স্মার্ট পয়েন্টার শ্রেণিতে সম্ভাব্য নাল পয়েন্টারটি মোড়ানো যাতে নাল চেকগুলি কেবলমাত্র এক জায়গায় প্রয়োজন হয়।

নাল পয়েন্টারটি সনাক্ত হওয়ার পরে কী করবেন? যদি আপনি ব্যতিক্রমী-কেস হ্যান্ডলিংটি তৈরি করতে না পারেন তবে আপনি সর্বদা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন, এবং সেই বিশেষ-কেস হ্যান্ডলিংটিকে কলারের কাছে কার্যকরভাবে অর্পণ করতে পারেন। আপনি যখন কোনও নাল পয়েন্টারকে অবজ্ঞা করেন তখন কিছু ভাষা ডিফল্টরূপে এটি করে।


1

সি ++ এর জন্য নির্দিষ্ট, তবে সেখানে নাল রেফারেন্সগুলি বাদ দেওয়া হয়েছে কারণ সি ++ এ নাল শব্দার্থবিজ্ঞান পয়েন্টার ধরণের সাথে সম্পর্কিত। কোনও ফাইল ওপেন ফাংশন ব্যর্থ হওয়া এবং নাল পয়েন্টারটি ফেরানো এটি বেশ যুক্তিসঙ্গত; আসলে fopen()ফাংশনটি ঠিক তাই করে exactly


প্রকৃতপক্ষে, আপনি যদি নিজেকে সি ++ এ নাল রেফারেন্সের সাথে খুঁজে পান তবে এটি কারণ আপনার প্রোগ্রামটি ইতিমধ্যে নষ্ট হয়ে গেছে
কাজ ড্রাগন 13

1

এটি ভাষার উপর নির্ভর করে।

উদাহরণস্বরূপ, অবজেক্টিভ-সি আপনাকে সমস্যা ছাড়াই নাল (শূন্য) বস্তুটিতে একটি বার্তা প্রেরণ করতে দেয়। শূন্য করার জন্য একটি কলও শূন্য দেয় এবং একটি ভাষা বৈশিষ্ট্য হিসাবে বিবেচিত হয়।

আমি ব্যক্তিগতভাবে এটি পছন্দ করি যেহেতু আপনি সেই আচরণের উপর নির্ভর করতে পারেন এবং এই সমস্ত সংঘাতযুক্ত নেস্টেড নির্মাণগুলি এড়াতে পারেন if(obj == null)

এই ক্ষেত্রে:

if (myObject != nil && [myObject doSomething])
{
    ...
}

সংক্ষিপ্ত করা যেতে পারে:

if ([myObject doSomething])
{
    ...
}

সংক্ষেপে, এটি আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে।


0

আপনি নালাগুলি ফিরিয়ে দেন বা একটি ব্যতিক্রম নিক্ষেপ করেন না, যতক্ষণ আপনি এটি নথিভুক্ত করেন না I


এবং এটির নামও দিন: GetAddressMaybeবা GetSpouseNameOrNull
rwong

-1

একটি নাল রেফারেন্স সাধারণত ঘটে থাকে কারণ প্রোগ্রামের যুক্তিতে কিছু মিস হয়ে যায়, যেমন: আপনি কোডটির সেই ব্লকের জন্য প্রয়োজনীয় সেট আপ না করেই কোডের একটি লাইন পেয়ে গেছেন।

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


2
একটি নাল রেফারেন্স অনেক কারণেই "ঘটতে পারে", যার মধ্যে খুব কমই যে কোনও কিছু মিস করা সম্পর্কিত। সম্ভবত আপনি এটি একটি নাল রেফারেন্স ব্যতিক্রম নিয়ে বিভ্রান্ত হয়ে পড়ছেন ।
অ্যারোনআউট

-1

নাল রেফারেন্সগুলি প্রায়শই খুব দরকারী: উদাহরণস্বরূপ, লিঙ্কযুক্ত তালিকার একটি উপাদানের কিছু উত্তরসূরি বা কোনও উত্তরসূরি থাকতে পারে। ব্যবহারnull"কোন উত্তরসূরি" এর জন্য করা একেবারে স্বাভাবিক। অথবা, একজন ব্যক্তির স্বামী থাকতে পারে বা না থাকতে পারে - null"ব্যক্তির কোনও স্ত্রী নেই" এর জন্য ব্যবহার করা একেবারে প্রাকৃতিক, কারও কারও " স্ত্রী বা স্ত্রী নেই" এর চেয়ে অনেক বেশি স্বাভাবিক the Person.Spouseসদস্যটি উল্লেখ করতে পারে এমন বিশেষ মান ।

তবে: অনেক মান alচ্ছিক নয় । একটি সাধারণ ওওপি প্রোগ্রামে, আমি বলতে পারি যে অর্ধেকেরও বেশি রেফারেন্স nullআরম্ভের পরে হতে পারে না , বা প্রোগ্রামটি ব্যর্থ হবে। অন্যথায় কোডটি if (x != null)চেক দিয়ে ছাঁটাই করতে হবে । সুতরাং কেন প্রতিটি রেফারেন্স ডিফল্টরূপে নমনীয় হওয়া উচিত ? এটি সত্যই অন্য উপায়ে হওয়া উচিত: ভেরিয়েবলগুলি ডিফল্টরূপে অ-পরিবর্তনযোগ্য হওয়া উচিত এবং আপনাকে স্পষ্টভাবে "ওহ, এবং এই মানটিও হতে পারে null" বলতে হবে।


আপনি নিজের উত্তরে আবার যুক্ত করতে চান এই আলোচনা থেকে কিছু আছে? এই মন্তব্যের থ্রেডটি কিছুটা উত্তপ্ত হয়ে উঠেছে এবং আমরা এটি পরিষ্কার করতে চাই। কোন বর্ধিত আলোচনায় গ্রহণ করা উচিত চ্যাট

এই দ্বন্দ্বের মাঝে প্রকৃত আগ্রহের এক বা দুটি পয়েন্ট থাকতে পারে। দুর্ভাগ্যক্রমে আমি বর্ধিত আলোচনাটি ছাঁটাই না করা পর্যন্ত মার্কের মন্তব্যটি দেখিনি। ভবিষ্যতে দয়া করে মডারেটরদের মনোযোগের জন্য আপনার উত্তরটিকে পতাকাঙ্কিত করুন যদি আপনি মন্তব্যগুলি পর্যালোচনা না করে এবং আপনার উত্তরটি যথাযথভাবে সম্পাদনা করার সময় না পাওয়া পর্যন্ত সংরক্ষণ করতে চান।
জোশ কে

-1

আপনার প্রশ্ন বিভ্রান্তিকরভাবে শব্দযুক্ত। আপনার অর্থ কি নাল রেফারেন্স ব্যতিক্রম (যা আসলে চেষ্টা করার কারণে ঘটেছিল) ডিরেফারেন্স নাল)? এই ধরণের ব্যতিক্রম না চাওয়ার সুস্পষ্ট কারণ হ'ল এটি আপনাকে কী ভুল হয়েছে সে সম্পর্কে কোনও তথ্য দেয় না, বা এমন কি - যখন প্রোগ্রামটির কোনও বিন্দুতে মানটি নির্ধারণ করা যেতে পারে। আপনি লিখেন "যদি আমি এমন কোনও ফাইলের অধ্যায়ের অ্যাক্সেসের অনুরোধ করি যা বিদ্যমান নেই তবে আমি ব্যতিক্রম বা শূন্য রেফারেন্স পেয়ে পুরোপুরি খুশি" - তবে এমন কোনও কারণ পেয়ে আপনি পুরোপুরি খুশি হওয়া উচিত নয় যা কারণটির কোনও ইঙ্গিত দেয় না you । স্ট্রিং-এর কোথাও "নালকে অবজ্ঞা করার চেষ্টা করা হয়েছিল" এর মধ্যে পঠন বা অ-বিদ্যমান ফাইলগুলির উল্লেখ নেই। সম্ভবত আপনি বোঝাতে চেয়েছেন যে আপনি কোনও রিড কল ​​থেকে রিটার্ন মান হিসাবে বাতিল হয়ে পুরোপুরি খুশি হবেন - এটি সম্পূর্ণ ভিন্ন বিষয়, তবে এটি পড়তে ব্যর্থ হয়েছে কেন সে সম্পর্কে আপনাকে কোনও তথ্য দেয় না; এটি '


না, আমি কোনও নাল রেফারেন্স ব্যতিক্রম বলতে চাইছি না। সমস্ত ভাষায় আমি জানি অবিচ্ছিন্ন তবে ঘোষিত ভেরিয়েবলগুলি শূন্যতার কিছু ফর্ম।
davidk01

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

1
"... তবে এর পরিবর্তে মোড়কের জিনিসগুলি ব্যবহার করুন যা বিকল্পভাবে একটি মান থাকতে পারে " " যা স্পষ্টভাবে একটি nallable টাইপ মত কিছুই
অ্যারোনআউট

1
হ্যাসকেলে অবিচ্ছিন্ন ভেরিয়েবলের মতো জিনিস নেই। আপনি সম্ভবত একটি আইওআরএফ ঘোষণা করতে পারেন এবং এটির সাথে প্রাথমিক মান হিসাবে কোনটিই বীজ করতে পারতেন না তবে এটি অন্য কোনও ভাষায় ভেরিয়েবল ঘোষণার এবং এটি অবিচ্ছিন্ন করে দেয়ার যা এনালাইজেশন যা এটি একই সমস্যাগুলির সাথে নিয়ে আসে। আইও মোনাড হ্যাশেল প্রোগ্রামারগুলির বাইরে খাঁটি ফাংশনাল কোরে কাজ করার কারণে রেফারেন্স ধরণের কোনও দ্বিধা নেই কারণ কোনও নাল রেফারেন্স সমস্যা নেই।
davidk01

1
আপনার যদি একটি ব্যতিক্রমী "মিসিং" মান থাকে তবে তা হ'ল ব্যতিক্রমী "নাল" মান হিসাবে সমান - আপনার যদি এটি পরিচালনা করতে একই সরঞ্জাম উপলব্ধ থাকে available এটি একটি উল্লেখযোগ্য "যদি"। এই মামলাটি যেভাবেই পরিচালনা করতে আপনার অতিরিক্ত জটিলতা দরকার need হাসকেলে, প্যাটার্ন মেলানো এবং টাইপ সিস্টেম সেই জটিলতা পরিচালনা করতে সহায়তা করার একটি উপায় সরবরাহ করে। তবে অন্যান্য ভাষায় জটিলতা পরিচালনার জন্য অন্যান্য সরঞ্জাম রয়েছে। ব্যতিক্রম যেমন একটি সরঞ্জাম।
স্টিভ 314
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.