নিম্নলিখিত কোড নিক্ষেপ NullPointerException
:
int num = Integer.getInteger("123");
আমার সংকলকটি getInteger
স্থির হওয়ার পরেও কি নালার দিকে অনুরোধ করছে? যে কোন মানে নেই!
কি হচ্ছে?
নিম্নলিখিত কোড নিক্ষেপ NullPointerException
:
int num = Integer.getInteger("123");
আমার সংকলকটি getInteger
স্থির হওয়ার পরেও কি নালার দিকে অনুরোধ করছে? যে কোন মানে নেই!
কি হচ্ছে?
উত্তর:
এখানে খেলতে দুটি সমস্যা রয়েছে:
Integer getInteger(String)
আপনি যা ভাবেন তা করেন না
null
এই ক্ষেত্রে ফিরে আসেInteger
করার int
কারণ স্বয়ং-আনবক্সিং
Integer
হয় null
, NullPointerException
নিক্ষিপ্ত হয়পার্স (String) "123"
করার জন্য (int) 123
, আপনি উদাহরণস্বরূপ ব্যবহার করতে পারেন int Integer.parseInt(String)
।
Integer
এপিআই রেফারেন্সInteger.getInteger
এই পদ্ধতিটি কী করে তা সম্পর্কে ডকুমেন্টেশনের কী বলতে হবে তা এখানে:
public static Integer getInteger(String nm)
: নির্দিষ্ট নামের সাথে সিস্টেমের সম্পত্তিটির পূর্ণসংখ্যা মান নির্ধারণ করে। যদি নির্দিষ্ট নামের সাথে কোনও সম্পত্তি না থাকে, যদি নির্দিষ্ট নামটি খালি হয় বাnull
, বা সম্পত্তিটির সঠিক সংখ্যাসূচক বিন্যাস না থাকে তবেnull
তা ফিরিয়ে দেওয়া হবে।
অন্য কথায়, এই পদ্ধতির String
কোনও int/Integer
মানকে পার্সিংয়ের সাথে কোনও সম্পর্ক নেই , বরং এটি System.getProperty
পদ্ধতির সাথে করতে হবে ।
স্বীকারযোগ্যভাবে এটি বেশ অবাক হতে পারে। এটি দুর্ভাগ্যজনক যে লাইব্রেরিতে এরকম চমক রয়েছে, তবে এটি আপনাকে একটি মূল্যবান শিক্ষা দেয়: কোনও পদ্ধতি কী করে তা নিশ্চিত করার জন্য সর্বদা ডকুমেন্টেশন সন্ধান করুন।
কাকতালীয়ভাবে, এই সমস্যার একটি তারতম্য ফিরিয়ে দেওয়া হয়েছে পাজলার্স: স্কলক অ্যান্ড অ্যাভ (টিএস -5586) , জোশ ব্লাচ এবং নীল গিটারের ২০০৯ জাভো টেকনিকাল সেশনের উপস্থাপনাটিতে was এখানে সমাপ্তি স্লাইড:
নৈতিক
- অদ্ভুত এবং ভয়ানক পদ্ধতি লাইব্রেরিতে লুকিয়ে আছে
- কারও কারও নিরীহ শব্দ রয়েছে
- যদি আপনার কোডটি খারাপ ব্যবহার করে
- আপনি সঠিক পদ্ধতিগুলি কল করছেন তা নিশ্চিত করুন
- গ্রন্থাগারের ডকুমেন্টেশন পড়ুন
- এপিআই ডিজাইনারদের জন্য
- অন্তত বিস্ময়ের নীতি লঙ্ঘন করবেন না
- বিমূর্ত স্তরক্রম লঙ্ঘন করবেন না
- বন্যভাবে বিভিন্ন আচরণের জন্য অনুরূপ নাম ব্যবহার করবেন না
সম্পূর্ণতার জন্য, এই পদ্ধতিগুলিও সাদৃশ্যপূর্ণ Integer.getInteger
:
অন্য সমস্যাটি অবশ্যই তা কীভাবে NullPointerException
ছুঁড়ে যায়। এই ইস্যুতে ফোকাস করতে, আমরা নীচে স্নিপেট সহজতর করতে পারেন:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
কার্যকর জাভা 2 য় সংস্করণ, আইটেম 49 এর একটি উদ্ধৃতি এখানে: বাক্সের আদিমগুলিতে আদিম ধরণের পছন্দ করুন:
সংক্ষেপে, আপনি যখনই পছন্দ পাবেন বাক্সের আদিমকে অগ্রাধিকার হিসাবে আদিম ব্যবহার করুন। আদিম ধরণেরগুলি সহজ এবং দ্রুত। আপনার যদি অবশ্যই বাক্সের আদিম ব্যবহার করা হয় তবে সাবধান! অটোবক্সিং বাক্স আদিমগুলি ব্যবহারের ক্রিয়াটি কমিয়ে দেয় তবে বিপদ নয়। যখন আপনার প্রোগ্রাম
==
অপারেটরের সাথে দুটি বক্সযুক্ত আদিমতার তুলনা করে, এটি একটি পরিচয় তুলনা করে, যা প্রায়শই আপনি চান তা নয়। যখন আপনার প্রোগ্রামটি বাক্সযুক্ত এবং আনবক্সযুক্ত আদিমগুলিতে জড়িত মিশ্র-প্রকারের গণনাগুলি করে, এটি আনবক্সিং করে এবং যখন আপনার প্রোগ্রামটি আনবক্সিং করে, তখন এটি ছুঁড়ে দিতে পারেNullPointerException
। অবশেষে, যখন আপনার প্রোগ্রামটি প্রাথমিক মানগুলিকে বাক্স করে, তখন এটি ব্যয়বহুল এবং অপ্রয়োজনীয় অবজেক্ট তৈরির ফলস্বরূপ হতে পারে।
এমন জায়গাগুলি রয়েছে যেখানে আপনার বাক্সের আদিমগুলি যেমন জেনেরিকগুলি ব্যবহার করা ছাড়া কোনও বিকল্প নেই তবে অন্যথায় বাক্সের আদিম ব্যবহারের সিদ্ধান্তটি ন্যায়সঙ্গত কিনা তা আপনার গুরুত্ব সহকারে বিবেচনা করা উচিত।
Integer.getInteger(s)
মোটামুটি সমান Integer.parseInt(System.getProperty(s))
? আমি মনে করি যে আমি দ্বিতীয়টি পছন্দ করি, যদিও এটি আরও ভার্বোস, যদিও এটি আপনাকে সিস্টেমের বৈশিষ্ট্য থেকে তথ্য টানছে এমনটি তুলে ধরে।
Integer.decode
পরিবর্তে এটি ব্যবহার করে Integer.parseInt
যা একটি নেতৃত্বের সন্ধান করে 0x
বা 0
যথাক্রমে হেক্সাডেসিমাল বা অষ্টাল হিসাবে সংখ্যাকে পার্স করার জন্য।
NullPointerException
? : প্রোগ্রামার.সটাকেক্সচেঞ্জ / প্রশ্ন
Http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html থেকে :
getInteger 'নির্দিষ্ট নামের সাথে সিস্টেমের সম্পত্তিটির পূর্ণসংখ্যা মান নির্ধারণ করে।'
তুমি এটা চাও:
Integer.parseInt("123")
GetInteger () পদ্ধতির ডকুমেন্টেশন চেক করুন । এই পদ্ধতিতে, String
প্যারামিটারটি একটি সিস্টেম বৈশিষ্ট্য যা নির্দিষ্ট নামের সাথে সিস্টেম সম্পত্তির পূর্ণসংখ্যার মান নির্ধারণ করে। "123" কোনও সিস্টেম সম্পত্তি হিসাবে নাম হিসাবে এখানে আলোচনা করা হয় না । আপনি যদি এই স্ট্রিংকে রূপান্তর করতে চান int
তবে সেই পদ্ধতিটি ব্যবহার করুন
int num = Integer.parseInt("123")
।