"অবজেক্টের রেফারেন্স কোনও বস্তুর উদাহরণে সেট করা হয় না" কেন আমাদের কোন বস্তুটি বলবে না?


39

আমরা একটি সিস্টেম চালু করছি এবং আমরা মাঝে মাঝে NullReferenceExceptionবার্তাটি সহ বিখ্যাত ব্যতিক্রম পাই Object reference not set to an instance of an object

তবে, এমন একটি পদ্ধতিতে যেখানে আমাদের প্রায় 20 টি অবজেক্ট রয়েছে, একটি লগ থাকা যা বলে যে কোনও বস্তু নਾਲ, এটি কোনওভাবেই কার্যকর নয়। এটি আপনাকে বলার মতো, যখন আপনি একটি সেমিনারের সিকিউরিটি এজেন্ট হন, 100 জন উপস্থিতির মধ্যে একজন ব্যক্তি সন্ত্রাসী। আসলেই এটি আপনার কোনও উপকারে আসে না। আপনার আরও তথ্য পাওয়া উচিত, যদি আপনি সনাক্ত করতে চান তবে কোন ব্যক্তি হুমকী ব্যক্তি।

তেমনিভাবে, আমরা যদি বাগটি সরাতে চাই তবে আমাদের জানতে হবে কোন বস্তুটি শূন্য।

এখন, কিছু কিছু মাস কয়েক মাস ধরে আমার মনকে আবদ্ধ করেছে এবং তা হ'ল:

NET কেন আমাদের নাম দেয় না বা কমপক্ষে অবজেক্ট রেফারেন্সের প্রকারটি দেয় যা শূন্য? । এটি প্রতিবিম্ব বা অন্য কোনও উত্স থেকে প্রকারটি বুঝতে পারে না?

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

আপডেট: ব্যতিক্রম The system cannot find the file specifiedএকই প্রকৃতি আছে। আপনি কোনও ফাইলটি খুঁজে পাবেন না, যতক্ষণ না আপনি প্রক্রিয়াটির সাথে সংযুক্ত হন এবং ডিবাগ করেন। আমার ধারণা এই ধরণের ব্যতিক্রম আরও বুদ্ধিমান হয়ে উঠতে পারে। NET c:\temp.txt doesn't exist.সেই সাধারণ বার্তার পরিবর্তে আমাদের জানাতে পারলে কি ভাল হত না ? বিকাশকারী হিসাবে, আমি হ্যাঁ ভোট দিই।


14
ব্যতিক্রমটিতে লাইন নম্বর সহ একটি স্ট্যাক ট্রেস অন্তর্ভুক্ত করা উচিত। আমি সেখান থেকে আমার তদন্ত শুরু করব সেই লাইনে অ্যাক্সেস করা প্রতিটি বস্তুর দিকে তাকিয়ে।
ব্যক্তিগতনেেক্সাস

2
এছাড়াও, আমি সবসময়ই ভেবে দেখেছি কেন ভিজুয়াল স্টুডিওতে ব্যতিক্রম হেল্পার ডায়ালগটিতে newকোনও শ্রেণীর উদাহরণ তৈরি করতে "সহায়ক" ইঙ্গিতটি অন্তর্ভুক্ত । এই জাতীয় ইঙ্গিত কখন সত্যই সহায়তা করে?
পার্সোনালনেক্সাস

1
আপনার যদি দশটি অবজেক্ট কলের শৃঙ্খলা থাকে তবে আপনার ডিজাইনে কাপলিংয়ের ক্ষেত্রে আপনার সমস্যা হয়েছে।
পিট কিরখাম

4
এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/14787580/...

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

উত্তর:


28

NullReferenceExceptionমূলত আপনাকে বলে: আপনি এটা ভুল করছেন। বেশিও না কমও না. বিপরীতে, এটি একটি পূর্ণ উন্নত ডিবাগিং সরঞ্জাম নয়। এই ক্ষেত্রে আমি বলব যে আপনি এটি উভয়ই ভুল করছেন

  • একটি নালারফেরান এক্সেপশন আছে
  • আপনি কেন এমনভাবে বাধা দেননি কেন / কেন হয়েছে তা জানেন
  • এবং এটিও হতে পারে: 20 টি জিনিসের জন্য একটি পদ্ধতিটি কিছুটা বন্ধ বলে মনে হচ্ছে

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

void Method(string a, SomeObject b)
{
    if (a == null) throw ArgumentNullException("a");
    if (b == null) throw ArgumentNullException("b");

    // See how nice this is, and what peace of mind this provides? As long as
    // nothing modifies a or b you can use them here and be 100% sure they're not
    // null. Should they be when entering the method, at least you know which one
    // is null.
    var c = FetchSomeObject();
    if(c == null)
    {
        throw InvalidOperationException("Fetching B failed!!");
    }

    // etc.
}

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


17
@ সাeedদনেমতি আপনি বোঝাচ্ছেন না যে আপনার কাছে একটি বিশাল কোডবেস আছে কারণ আপনার উচিত না শালীন ত্রুটি পরীক্ষা করা, ঠিক? প্রকল্পটি যত বড় হবে তত বেশি গুরুত্বপূর্ণ ভূমিকা বা ত্রুটি পরীক্ষা করা এবং প্রতিবেদন করা গুরুত্বপূর্ণ।
stijn

6
ভাল পরামর্শের জন্য +1, এমনকি যদি এটি প্রকৃত প্রশ্নের উত্তর না দেয় (যা সম্ভবত কেবল আন্ডারস হেলসবার্গ উত্তর দিতে পারে)।
রস প্যাটারসন

12
চমৎকার পরামর্শের জন্য +1। @ সাeedদনেমতি আপনার এই পরামর্শটি শোনা উচিত। আপনার সমস্যাটি অসাবধানতা এবং কোডটিতে পেশাদারিত্বের অভাবের কারণে ঘটে। আপনার কাছে ভাল কোড লেখার সময় না থাকলে আপনার আরও অনেক বড় সমস্যা রয়েছে ...
ম্যাটডাভে

3
আপনার যদি ভাল কোড লেখার সময় না থাকে তবে আপনার কাছে অবশ্যই খারাপ কোড লেখার সময় নেই । খারাপ কোড লিখতে ভাল কোড লেখার চেয়ে বেশি সময় লাগে। আপনি যদি সত্যিই বাগগুলির বিষয়ে চিন্তা না করেন। এবং আপনি যদি সত্যিই বাগগুলি সম্পর্কে চিন্তা করেন না তবে প্রোগ্রামটি কেন লিখবেন?
মার্কজে

5
@ সাইদনেমতি I only say that checking every object to get sure that it's not null, is not a good methodসিরিয়াসলি। এটি সেরা পদ্ধতি। এবং কেবল নাল নয়, যুক্তিযুক্ত মানগুলির জন্য প্রতিটি যুক্তি পরীক্ষা করুন। আগে আপনি ত্রুটিগুলি ধরেন, কারণ খুঁজে পাওয়া সহজ। কলিং কলটি খুঁজতে আপনাকে স্ট্যাক ট্রেসের কয়েকটি স্তরের ব্যাকট্র্যাক করতে হবে না।
jgauffin

19

আপনি যা কল করতে চাইছেন তা সত্যই এটি প্রদর্শিত হবে should এটি বলার মতো "একটি সমস্যা আছে। আপনার এটি ঠিক করা দরকার it আমি এটি কী তা জানি I'm আমি আপনাকে বলব না You আপনি এটি বের করে দেখুন" এই স্ট্যাক ওভারফ্লোতে অর্ধেক উত্তর মত বিট, তামাশা করুন।

সুতরাং এটি কতটা কার্যকর হবে, উদাহরণস্বরূপ, আপনি যদি এটি পেয়ে থাকেন ...

Object reference (HttpContext.Current) not set to instance of an object

...? কোডে যেতে হয়, এটির মাধ্যমে পদক্ষেপ নিতে হবে এবং আপনি যে জিনিসটি কল করতে চেষ্টা করছেন nullসেটি ভাল তা নিয়ে কাজ করুন, তবে কেন কেবল আমাদের সামান্য সাহায্যের হাত দিচ্ছেন না?

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

শুধু Sayin.


রানটাইমটি কীভাবে শূন্য হয় তা জানার কথা?
উইল

3
রানটাইমের কাছে সরবরাহের চেয়ে আরও বেশি তথ্য রয়েছে। এটি যে দরকারী দরকারী তথ্য, এটি সরবরাহ করা উচিত। আমি এটাই বলছি। আপনার প্রশ্নের জবাবে, কেন এটি জানে না? আপনি যদি উত্তরটি জানেন তবে আপনি নিজের চেয়ে আরও ভাল মন্তব্য দিতে সক্ষম হতে পারেন।
লিভারপুলস

রাজি হয়েছি, এবং আমি KeyNotFoundExceptionএবং অন্যান্য অনেক বিরক্তির জন্যও একই কথা বলব ...
সাইনলাও



4

আপনার লগটিতে একটি স্ট্যাক ট্রেস অন্তর্ভুক্ত করা উচিত - যা সাধারণত আপনাকে পদ্ধতির কোন লাইনে সমস্যা রয়েছে তা বোঝায়। আপনার রিলিজ বিল্ডে পিডিবি প্রতীকগুলি অন্তর্ভুক্ত করার প্রয়োজন হতে পারে যাতে ত্রুটিটি কোন লাইনে রয়েছে সে সম্পর্কে আপনার ধারণা রয়েছে।

মঞ্জুর, এটি আপনাকে এই ক্ষেত্রে সাহায্য করবে না:

Foo.Bar.Baz.DoSomething()

বলুন জিজ্ঞাসা করবেন না যেমন কোড এড়াতে নীতি করতে পারে।

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


2

কল চেইন আপ ব্যতিক্রমী অ-মারাত্মক অবস্থার সিগন্যাল করার সরঞ্জাম হিসাবে ব্যতিক্রমগুলি তৈরি করা হয়েছে । এটি হ'ল এগুলি ডিবাগিং সরঞ্জাম হিসাবে ডিজাইন করা হয়নি।

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

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

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


1

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

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

শুভেচ্ছা Object reference not set to an instance of an objectকোড মান এ অনুমান করতে পারেন আমরা পছন্দ করতে পারেন: প্রোগ্রামারদের হিসাবে আমাদের কাজ, এবং এটা শুধু মানে আপনি একটি uninitialised পরিবর্তনশীল অতিক্রান্ত হয়েছে।


আপনি কি বুঝতে পেরেছেন যে লোকেরা সমাবেশ ভাষায় লেখার জন্য এরূপ ন্যায্যতা সরবরাহ করত? এবং স্বয়ংক্রিয় আবর্জনা সংগ্রহ ব্যবহার করছেন না? এবং গণিত করতে সক্ষম হচ্ছেন - হেক্সে? "কঠোর, ক্লান্তিকর এবং কখনও কখনও নিস্তেজ" হ'ল আমরা কীভাবে স্বয়ংক্রিয়ভাবে কাজ করা উচিত সেই জবগুলি বর্ণনা করি।
স্পাইক0xff

0

ডিবাগারটি ব্যবহার করতে শিখুন। এটি হ'ল ধরণের জিনিস যা এর জন্য ডিজাইন করা হয়েছে। প্রশ্নে পদ্ধতিতে একটি ব্রেক পয়েন্ট সেট করুন এবং আপনি চলে যাবেন।

আপনার কোডটি কেবল পদক্ষেপে দেখুন এবং নির্দিষ্ট পয়েন্টে আপনার সমস্ত ভেরিয়েবলের মানগুলি ঠিক কী তা দেখুন।

সম্পাদনা: সত্যই আমি হতবাক হয়েছি যে কেউ এখনও ডিবাগার ব্যবহারের কথা উল্লেখ করেনি।


2
সুতরাং আপনি বলছেন যে কোনও ব্যর্থতা সহজেই আবার তৈরি করা যায় ডিবাগার ব্যবহার করার সময়?
jgauffin

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

1
সুতরাং আপনি বলছেন যে আমাদের সর্বদা ব্যর্থ কম্পিউটারে অ্যাক্সেস রয়েছে এবং সেই ডিবাগিং ইউনিট পরীক্ষার চেয়ে ভাল?
jgauffin

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

0

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

<CodeSnippet Format="1.0.0">
  <Header>
    <Title>EnsureArgNotNull</Title>
    <Shortcut>argnull</Shortcut>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>argument</ID>
        <ToolTip>The name of the argument that shouldn't be null</ToolTip>
        <Default>arg</Default>
      </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[if ($argument$ == null) throw new ArgumentNullException("$argument$");$end$]]>
    </Code>
  </Snippet>
</CodeSnippet>

দ্রষ্টব্য: সি # 6 তে এখন nameofআপনার স্নিপেটটি এমন হতে পারে throw new ArgumentNullException(nameof($argument$))যা যাদুর ধ্রুবকগুলি অন্তর্ভুক্ত না করা, সংকলক দ্বারা পরীক্ষা করা এবং রিফ্যাক্টরিং সরঞ্জামগুলির সাথে আরও ভালভাবে কাজ করার সুবিধা রয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.