একটি সাধারণ thisকখনই nullআসল জাভা কোড 1 এ থাকতে পারে না এবং আপনার উদাহরণটি একটি সাধারণ ব্যবহার করে this। আরও তথ্যের জন্য অন্যান্য উত্তরগুলি দেখুন।
যোগ্য কখনও হওয়া this উচিত নয় null, তবে এটি এড়ানো সম্ভব। নিম্নোক্ত বিবেচনা কর:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
যখন আমরা একটি উদাহরণ তৈরি করতে চাই Inner, আমাদের এটি করা দরকার:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
আউটপুটটি হ'ল:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
এটি দেখানো হচ্ছে যে এটির Innerএকটি nullরেফারেন্স সহ আমাদের তৈরির প্রচেষ্টা Outerব্যর্থ হয়েছে।
আসলে, আপনি যদি "বিশুদ্ধ জাভা" খামের মধ্যে থাকেন তবে আপনি এটি ভাঙ্গতে পারবেন না।
যাইহোক, প্রতিটি Innerউদাহরণের মধ্যে একটি লুকানো finalসিন্থেটিক ক্ষেত্র (ডাকা "this$0") থাকে যা এতে রেফারেন্স ধারণ করে Outer। আপনি যদি সত্যই কৌতূহলী nullহন তবে ক্ষেত্রটি নির্ধারণের জন্য "অ-খাঁটি" অর্থ ব্যবহার করা সম্ভব ।
- আপনি এটি করতে ব্যবহার
Unsafeকরতে পারেন।
- আপনি এটি করতে স্থানীয় কোড ব্যবহার করতে পারেন (যেমন জেএনআই)।
- আপনি এটি প্রতিবিম্ব ব্যবহার করে করতে পারেন।
যেভাবেই আপনি এটি করেন, শেষ ফলাফলটি হ'ল Outer.thisএক্সপ্রেশনটি null2 এ মূল্যায়ন করবে ।
সংক্ষেপে, এটা সম্ভব একজন যোগ্যতাসম্পন্ন জন্য thisহতে null। তবে যদি আপনার প্রোগ্রামটি "খাঁটি জাভা" বিধি অনুসরণ করে তবে এটি অসম্ভব ।
1 - আমি হাতের মাধ্যমে বাইটকোডগুলি "লেখা" এবং সত্যিকারের জাভা হিসাবে ছাড়িয়ে দেওয়া, বিসিইএল বা অনুরূপ ব্যবহার করে বাইটকোডগুলি টুইট করা বা স্থানীয় কোডে হ্যাপিং করা এবং সংরক্ষিত রেজিস্টারগুলির সাথে ডডলিংয়ের মতো কৌশলগুলি ছাড় করি। আইএমও, এটি জাভা নয়। হাইপোথিটিক্যালি, এই জাতীয় জিনিসগুলি কোনও জেভিএম বাগের ফলস্বরূপ ঘটতে পারে ... তবে আমি প্রতিটি দেখার ত্রুটি প্রতিবেদন মনে করতে পারি না।
2 - আসলে, জেএলএস আচরণটি কী হবে তা বলে না, এবং এটি বাস্তবায়ন নির্ভর হতে পারে ... অন্যান্য বিষয়ের মধ্যে।