কেন int num = Integer.getInteger ("123") নালপয়েন্টার এক্সসেপশনটি ফেলে?


106

নিম্নলিখিত কোড নিক্ষেপ NullPointerException:

int num = Integer.getInteger("123");

আমার সংকলকটি getIntegerস্থির হওয়ার পরেও কি নালার দিকে অনুরোধ করছে? যে কোন মানে নেই!

কি হচ্ছে?


3
পরিবর্তে Integer.getValue () ব্যবহার করুন। এই ব্লগ পোস্টটি কেন একটি ভাল ব্যাখ্যা তা হল: konigsberg.blogspot.in/2008/04/…
প্রাণেশর্মা

উত্তর:


212

বড় ছবি

এখানে খেলতে দুটি সমস্যা রয়েছে:

  • 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। অবশেষে, যখন আপনার প্রোগ্রামটি প্রাথমিক মানগুলিকে বাক্স করে, তখন এটি ব্যয়বহুল এবং অপ্রয়োজনীয় অবজেক্ট তৈরির ফলস্বরূপ হতে পারে।

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

সম্পর্কিত প্রশ্নগুলি


11
সুতরাং Integer.getInteger(s) মোটামুটি সমান Integer.parseInt(System.getProperty(s))? আমি মনে করি যে আমি দ্বিতীয়টি পছন্দ করি, যদিও এটি আরও ভার্বোস, যদিও এটি আপনাকে সিস্টেমের বৈশিষ্ট্য থেকে তথ্য টানছে এমনটি তুলে ধরে।
ম্যাট্রিক্সফ্রোগ

5
এই মন্তব্যটি পোস্ট করার সাথে সাথেই আমি বুঝতে পারলাম যে আমি কেবল পূর্ণসংখ্যার শ্রেণীর আসল উত্সটি দেখতে পারি! আমি সঠিক পথে ছিলাম, এটির Integer.decodeপরিবর্তে এটি ব্যবহার করে Integer.parseIntযা একটি নেতৃত্বের সন্ধান করে 0xবা 0যথাক্রমে হেক্সাডেসিমাল বা অষ্টাল হিসাবে সংখ্যাকে পার্স করার জন্য।
ম্যাট্রিক্সফ্রোগ

যারা জিজ্ঞাসা করছেন তাদের জন্য কেন NullPointerException? : প্রোগ্রামার.সটাকেক্সচেঞ্জ / প্রশ্ন
158908/…

2
@ ওরাকল আপনি java.lang.Integer.getInteger (স্ট্রিং) অনুগ্রহ করতে পারেন?
mjaggard


6

GetInteger () পদ্ধতির ডকুমেন্টেশন চেক করুন । এই পদ্ধতিতে, Stringপ্যারামিটারটি একটি সিস্টেম বৈশিষ্ট্য যা নির্দিষ্ট নামের সাথে সিস্টেম সম্পত্তির পূর্ণসংখ্যার মান নির্ধারণ করে। "123" কোনও সিস্টেম সম্পত্তি হিসাবে নাম হিসাবে এখানে আলোচনা করা হয় না । আপনি যদি এই স্ট্রিংকে রূপান্তর করতে চান intতবে সেই পদ্ধতিটি ব্যবহার করুন int num = Integer.parseInt("123")

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