অবজেক্টের রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা নেই W


103

এটি সম্পর্কিত। নেট আনহ্যান্ডেল ব্যতিক্রম বার্তা:

অবজেক্টের রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা হয়নি।

.NET কোন বস্তুটি তা দেখায় না null?

আমি জানি যে আমি nullত্রুটিটি পরীক্ষা করতে এবং সমাধান করতে পারি। তবে, নেট কেন কোন বস্তুকে নাল-রেফারেন্স দেয় এবং কোন অভিব্যক্তিটি ট্রিগার করেছিল তা নির্দেশ করতে সহায়তা করে না NullReferenceException?

c#  .net 

2
এটি যখন ঘটে তখন লাইনটি পুনরায় লিখুন যাতে এটি প্রথমে শূন্যের জন্য প্রতিটি সম্ভাব্য ফলাফল পরীক্ষা করে - তারপরে আপনি ঠিক কী তা বুঝতে পারবেন। হয় তা, বা ভিজ্যুয়াল স্টুডিওর আশ্চর্যজনক ডিবাগারটি সংযুক্ত রয়েছে, যা তাত্ক্ষণিকভাবে একটি ব্যতিক্রম ঘটে তা ভঙ্গ করে এবং আপনাকে কী শূন্য তা দেখতে দেয় :)
— পাতাসু

5
আসলেই নয়, তিনি কেবল জিজ্ঞাসা করেন যে .NET ফ্রেমওয়ার্ক প্রোগ্রামারকে কোন বস্তুটি শূন্য রয়েছে তা দেখাতে সহায়তা করে না । আমার ধারণা এটি পারফরম্যান্স পেনাল্টি (আপনার প্রতিচ্ছবি প্রয়োজন)। তবে আমিও নিশ্চিত নই।
— বাস

1
@ বাবস: এটি সত্য হলেও প্রশ্নটি কিছুটা বিভ্রান্তিকর যে এটি "অভিব্যক্তির" অংশ নয়, "অভিব্যক্তির একটি অংশ" সম্পর্কে জিজ্ঞাসা করা উচিত। এটি আরও ব্যাখ্যা করে যে নিছক প্রতিবিম্ব কেন সাহায্য করবে না, তবে কিছু বিস্তৃত ডিবাগ তথ্য প্রয়োজন হবে।
— অথবা ম্যাপার

4
তবুও আমি উত্তরের জন্য আগ্রহী। এটি নেট। ব্যাতিক্রমের মতো অনুরূপ যা অভিধানে কোন কী বিদ্যমান নয় তা নির্দেশ করতে সহায়তা করে না। এছাড়াও, আমি প্রশ্নে অনুগতদের বুঝতে পারি না।
— বাস

12
টার্মিনোলজি দয়া করে: কোনও বস্তু কখনই নਾਲ হয় না। একটি বস্তুর রেফারেন্স যদিও হতে পারে। তবে কোনও অবজেক্ট রেফারেন্স মেমরির কেবল একটি অবস্থান - এটি যদি আপনাকে কোনও ডিবাগার সংযুক্ত না করে তবে কীভাবে আপনাকে সহায়তা করবে?
— ওসকার বার্গগ্রেন

উত্তর:


169

(ভিজ্যুয়াল স্টুডিও 2017 এর নতুন ব্যতিক্রম সহায়ক সম্পর্কে তথ্যের জন্য এই উত্তরটির শেষে দেখুন)


এই কোডটি বিবেচনা করুন:

String s = null;
Console.WriteLine(s.Length);

এটি NullReferenceExceptionদ্বিতীয় লাইনে একটি নিক্ষেপ করবে এবং আপনি কেন জানতে চান N নেটটি আপনাকে বলবে না sযে ব্যতিক্রম ছোঁড়াবার সময় এটি বাতিল ছিল।

আপনি কেন সেই টুকরো তথ্যটি পান না তা বোঝার জন্য আপনার মনে রাখা উচিত যে এটি সি # উত্স নয় যা কার্যকর করে:

আইএল_0001: এলডনুল      
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: কলভার্ট সিস্টেম। স্ট্রিং.জেট_লেন্থ
আইএল_0009: কল করুন সিস্টেম.কনসোল.রাইটলাইন

এটি callvirtঅপকোড যা নিক্ষেপ করে NullReferenceExceptionএবং এটি এটি করে যে যখন মূল্যায়ন স্ট্যাকের প্রথম যুক্তিটি নাল রেফারেন্স হয় (এটি যা ব্যবহার করে বোঝানো হয়েছিল ldloc.0)।

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


এই সমস্যাটি এড়াতে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি সমস্ত পাবলিক মেথড কলগুলিতে আর্গুমেন্ট নাল চেকিং করুন (অবশ্যই যদি আপনি নাল রেফারেন্সের অনুমতি না দেন):

public void Foo(String s) {
  if (s == null)
    throw new ArgumentNullException("s");
  Console.WriteLine(s.Length);
}

যদি নালটি পদ্ধতিতে পাস করা হয় তবে আপনি একটি ব্যতিক্রম পান যা সমস্যাটি কি তা স্পষ্টভাবে বর্ণনা করে (এটি sনাল)।


চার বছর পরে ভিজ্যুয়াল স্টুডিও 2017 এর এখন একটি নতুন ব্যতিক্রম সহায়ক রয়েছে যা NullReferenceExceptionনিক্ষিপ্ত হলে কোনটি নালার তা বলতে চেষ্টা করবে । এমনকি এটি কোনও প্রয়োজনীয় পদ্ধতির ফেরতের মান হলে এটি আপনাকে প্রয়োজনীয় তথ্য দিতে সক্ষম হয়:

ভিজ্যুয়াল স্টুডিও 2017 ব্যতিক্রম সহায়ক

মনে রাখবেন এটি কেবল একটি ডিইবিইউজি বিল্ডে কাজ করে।


5
লাইন নম্বর এবং উত্স ফাইলের নামগুলি নিজেই আইএল কোডে সংরক্ষণ করা হয় না হয়, না সেগুলি হয়? তবুও, এগুলি ডিবাগিংয়ের জন্য উপলব্ধ করা যেতে পারে।
— বা ম্যাপার

4
@ মার্টিনলিভারেজ: হুবহু সুতরাং প্রশ্নটি এখানে ফুটে উঠেছে: কেন প্রতীক ফাইলগুলিতে পর্যাপ্ত তথ্য সঞ্চিত নেই যা কোডের মধ্যে কী প্রকাশকে মূল্যায়ন করা হয়েছিল তাও জানায় null।
— বা ম্যাপার

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

3
হুম, এবং আমাদের ভুলে যাওয়া উচিত নয় যে এটি এমনকি বাস্তবায়িত কার্যকর আইএলও নয়, বরং রানটাইমের সময় এটি থেকে তৈরি দেশীয় কোড।
— ওসকার বার্গগ্রেন

2
@ মার্টিনলিভারেজ: এই প্রশ্নের কেউ দাবি করেন না যে আমরা এটি মুক্তির বিল্ডগুলির জন্য নিখুঁতভাবে সমর্থিত চাই। যাইহোক, আমি আইএল অপকোডকে সংযোগ স্থাপনে বেশিরভাগ সমস্যা দেখছি না nullযা উত্সের রেফারেন্সটি ফিরিয়ে দিয়েছে উত্স ফাইল লাইন এবং কলামের সাথে একটি অবজেক্ট রেফারেন্স (যা হতে পারে ) uses
— বা ম্যাপার

9

নিম্নলিখিত ক্ষেত্রে ত্রুটির বার্তাটি কেমন দেখতে চাইছেন?

AnyObject.GetANullObject().ToString();

private object GetANullObject()
{
  return null;
}

এখানে রিপোর্ট করার মতো কোনও পরিবর্তনশীল নাম নেই!


2
আমি সন্দেহ করি যে ওপি উত্স কোডে অভিব্যক্তিটি সন্ধান করছে যা অবজেক্টটি নয়, নাল ফেরায়। আমি প্রশ্নে একটি স্বতন্ত্র মন্তব্য যুক্ত করেছি এবং আশা করি তিনি বা সে বিষয়গুলি পরিষ্কার করে দেবে। আমার সন্দেহটি যদি সঠিক হয় তবে ওপি Object reference obtained from AnyObject.GetANullObject() not set to an instance of an object.ত্রুটি বার্তার মতো কিছু আশা করবে ।
— অথবা ম্যাপার

1
@ এমআরএম্পার আমি সম্মত আমি ওপি-তে একটি মন্তব্যে কেবল আমার "উত্তর" রেখে দিতাম, যদি আমার মন্তব্য করার মতো যথেষ্ট খ্যাতি পয়েন্ট থাকে!
— রোমার

1
"ক্লাস এক্সওয়াইজেডের টোস্ট্রিং () পদ্ধতিটি কল করার চেষ্টা করা একটি নাল রেফারেন্স" আমরা এখন যা পাই তার থেকে বেশি সহায়ক হবে।
— মাইকেল লেভি

সর্বাধিক সহায়ক জিনিস হ'ল স্ট্যাক ট্রেস দেখানো হবে, প্রতিটি কল স্তরে ঠিক কোন লাইনে, কোন ফাইলটিতে, ত্রুটির ফলে হয়েছিল। ওহ, অপেক্ষা করুন ... এটি এখন এটি কি!
— জিম বাল্টার

1

ঠিক আছে, এটি মাইক্রোসফ্ট এর ইঞ্জিনিয়ারদের উত্তর দিতে হবে। তবে আপনি অবশ্যই একটি ডিবাগার ব্যবহার করতে পারেন এবং এর মধ্যে কোনটির সমস্যা রয়েছে তা জানতে ঘড়ি যুক্ত করতে পারেন।

তবে ব্যতিক্রমটি NullReferenceExceptionযার অর্থ রেফারেন্সটির অস্তিত্ব নেই । আপনি যে বস্তুটি তৈরি করেননি তা পেতে পারেন না।

but why .NET don't tell us which object is null? কারণ এটি জানে না কোন পদটি নাল। বস্তুর সহজভাবে অস্তিত্ব নেই!

একই কথাটি যখন আমি বলি, সি # .NET আইএল কোডে সংকলিত হয়। .NET IL কোডটি নাম বা এক্সপ্রেশন জানে না। এটি কেবল রেফারেন্স এবং তাদের অবস্থান জানে। এখানেও, আপনি যা পাবেন না তা পেতে পারেন না। অভিব্যক্তি বা পরিবর্তনশীল নামটি বিদ্যমান নেই।

দর্শন: আপনার প্রথমদিকে ডিম না থাকলে আপনি ওমলেট ​​তৈরি করতে পারবেন না।


3
এটি কোনও উত্তর নয় :)
— বাস

রেফারেন্সের অস্তিত্ব না থাকলে আপনি কীভাবে পাবেন? @ বাস
— অনিকেত

4
"ঠিক আছে, এটি মাইক্রোসফ্টের ইঞ্জিনিয়ারদের উত্তর দেওয়ার জন্য।" তাই তাদের এই একটি হালকা চালা পরিবর্তে জানায় সুস্পষ্ট এর দিন
— Bas

@ বস আমরা খুব কম সময়ে কী যৌক্তিক তা সিদ্ধান্ত নিতে পারি। যৌক্তিকভাবে বস্তুর অস্তিত্ব নেই। কীভাবে আপনি এটি ব্যতিক্রম সহ ধরবেন এবং তারপরে অবজেক্টটির নাম মুদ্রণ করবেন? এটি কেবল অস্তিত্ব নেই। এমনকি স্ট্যাকেও নেই ..
— অনিকেত ইনজে

সুতরাং উত্তরটি হ'ল কার্যত অসম্ভব যেটি নির্দিষ্ট করে বলা যায় যে কোন বস্তুর নালারভ্রংশ রয়েছে? এটিও একটি উত্তর। আমি জানিনা যে আমি জানি না, আমি ঠিক প্রশ্ন পছন্দ করি :)। সমস্ত প্রচেষ্টার জন্য +1: পি
— বাস

1

নিশ্চিত নয়, তবে এটি কারণ হতে পারে N নেট এটি পূর্বনির্ধারিত শ্রেণি বা ব্যবহারকারী-সংজ্ঞায়িত কিনা তা জানে না। যদি এটি পূর্বনির্ধারিত হয় তবে এটি নাল হতে পারে (স্ট্রিংয়ের মতো যা 2 বাইট দখল করে) তবে এটি যদি ব্যবহারকারী-সংজ্ঞায়িত হয় তবে আমাদের এটির একটি উদাহরণ তৈরি করতে হবে যাতে এটি জানে যে এই অবজেক্টটি এই অনেক বেশি স্মৃতি দখল করবে। সুতরাং এটি রান-টাইমে ত্রুটি নিক্ষেপ করে।


-2

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

আপনার সর্বোত্তম বিকল্পটি এটি ডিবাগিংয়ের তথ্য দিয়ে ডিবাগারে চালানো এবং আপনার আইডিই আপত্তিজনক লাইনে ভেঙে যায় (বরং স্পষ্টভাবে প্রমাণ করে যে দরকারী তথ্য আসলে পাওয়া যায়)।

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