স্ট্রিং.ভালিউওফ (নাল) কেন নালপয়েন্টার এক্সসেপশন দেয়?


127

ডকুমেন্টেশন অনুসারে, পদ্ধতিটি String.valueOf(Object obj)ফিরে আসে:

যদি আর্গুমেন্টটি হয় nullতবে তারপরে একটি স্ট্রিং "null"; অন্যথায়, এর মান obj.toString()ফিরে আসে।

তবে আমি যখন এটি করার চেষ্টা করব তখন কীভাবে আসে:

System.out.println("String.valueOf(null) = " + String.valueOf(null));

এটি পরিবর্তে এনপিই ছুড়ে দেয়? (আপনি বিশ্বাস না হলে নিজে চেষ্টা করুন!)

    থ্রেড "মূল" java.lang. নালপয়েন্টারএক্সেপশন ব্যতিক্রম
    জাভা.লাং.স্ট্রিং এ। (অজানা উত্স)
    java.lang.String.valueOf এ (অজানা উত্স)

এ কেমন হচ্ছে? ডকুমেন্টেশন আমার মিথ্যা? এটি কি জাভাতে একটি বড় বাগ?

উত্তর:


201

সমস্যাটি হল যে String.valueOfপদ্ধতিটি ওভারলোড হয়েছে :

জাভা স্পেসিফিকেশন ভাষা নির্দেশ দেয় যে এই ধরণের ক্ষেত্রে সর্বাধিক নির্দিষ্ট ওভারলোডটি বেছে নেওয়া হয়:

জেএলএস 15.12.2.5 সর্বাধিক নির্দিষ্ট পদ্ধতি নির্বাচন করা

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

char[] -হ'ল Object , তবে সব Object -ই নয় char[]। অতএব, char[]হয় আরো নির্দিষ্ট চেয়ে Object, এবং জাভা ভাষা দ্বারা নির্দিষ্ট করা থাকে, String.valueOf(char[])জমিদার এই ক্ষেত্রে নির্বাচিত করা হয়।

String.valueOf(char[])অ্যারেটি অ-হিসাবে প্রত্যাশা করে nullএবং যেহেতু nullএই ক্ষেত্রে দেওয়া হয়, এটি তখন ছুঁড়ে দেয় NullPointerException

সহজ "ফিক্স" হ'ল nullস্পষ্টভাবে Objectনিম্নলিখিতভাবে কাস্ট করা :

System.out.println(String.valueOf((Object) null));
// prints "null"

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


গল্পের নৈতিক

বেশ কয়েকটি গুরুত্বপূর্ণ রয়েছে:

  • কার্যকর জাভা 2 য় সংস্করণ, আইটেম 41: ন্যায়বিচারের সাথে ওভারলোডিং ব্যবহার করুন
    • কেবলমাত্র আপনি ওভারলোড করতে পারেন, এর অর্থ এই নয় যে আপনার প্রতিবার করা উচিত
    • এগুলি বিভ্রান্তির কারণ হতে পারে (বিশেষত যদি পদ্ধতিগুলি বিভিন্নভাবে বিভিন্ন কাজ করে)
  • ভাল আইডিই ব্যবহার করে আপনি সংকলনের সময় কোন ওভারলোড নির্বাচন করা হয়েছে তা যাচাই করতে পারেন
    • অন্ধকার সঙ্গে, আপনি উপরে অভিব্যক্তি উপর মাউস-বাতাসে ভেসে থাকতে ও দেখতে যে প্রকৃতপক্ষে , valueOf(char[])জমিদার নির্বাচিত করা হয়!
  • কখনও কখনও আপনি স্পষ্টভাবে কাস্ট করতে চান null(অনুসরণ করার উদাহরণগুলি)

আরো দেখুন


ভোটদানের সময় null

কমপক্ষে দুটি পরিস্থিতি রয়েছে যেখানে nullএকটি নির্দিষ্ট রেফারেন্স প্রকারে স্পষ্টভাবে কাস্টিং প্রয়োজনীয়:

  • অতিরিক্ত লোডিং নির্বাচন করতে (উপরের উদাহরণ হিসাবে দেওয়া হয়েছে)
  • দিতে nullএকটি vararg পরামিতি একটি একক আর্গুমেন্ট হিসাবে

পরবর্তীগুলির একটি সাধারণ উদাহরণ নিম্নরূপ:

static void vararg(Object... os) {
    System.out.println(os.length);
}

তারপরে, আমাদের নিম্নলিখিতগুলি থাকতে পারে:

vararg(null, null, null); // prints "3"
vararg(null, null);       // prints "2"
vararg(null);             // throws NullPointerException!

vararg((Object) null);    // prints "1"

আরো দেখুন

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


5
আরেকটি পরামর্শ: আপনি যখন কোনও পদ্ধতি ওভারলোড করেন এবং দুটি যুক্তি (যেমন nullএই ক্ষেত্রে) তে একটি যুক্তি কল করা যায় , তখন নিশ্চিত হয়ে নিন যে উভয় ওভারলোডগুলি সেই মানটির ক্ষেত্রে একই আচরণ করে!
জোছিম সউর

3
@ জোয়াচিম: আমি কেবল এই জিনিসটি পড়েছি এবং আনন্দিতভাবে অবাক হয়েছি যে এই দুটি পদ্ধতির স্পষ্টভাবে আলোচনা করা হয়েছিল! ব্লচ আরও এক ধাপ এগিয়ে গিয়ে দাবি করেছেন যে যেহেতু String.valueOf(Object)এবং valueOf(char[])যেভাবেই হোক সম্পূর্ণ ভিন্ন জিনিস (নির্বিশেষে nullবা নির্বিশেষে ) করুন যে সম্ভবত তাদের প্রথম জায়গায় ওভারলোড করা উচিত হয়নি।
বহুবিশ্লেষকারক

একটি প্রশ্ন পেয়েছেন ... যদি আপনার এমন কোনও পদ্ধতি থাকে যা কোনও অবজেক্ট ফেরত দেয় তবে বিবৃতিটি return null;হুবহু একই জিনিস হবে return (Object) null;?
user972276

17

সমস্যা হলো আপনাকে কল করছি String.valueOf(char[])এবং না String.valueOf(Object)

এর কারণ হ'ল জাভা সর্বদা ওভারলোডেড পদ্ধতির সুনির্দিষ্ট সংস্করণটি চয়ন করবে যা সরবরাহিত পরামিতিগুলির সাথে কাজ করে। nullএকটি Objectপ্যারামিটারের জন্য একটি বৈধ মান , তবে এটি char[]পরামিতিগুলির জন্য একটি বৈধ মান ।

জাভাটিকে Objectসংস্করণটি ব্যবহার করতে , হয় nullভেরিয়েবলের মাধ্যমে পাস করুন বা অবজেক্টের জন্য একটি স্পষ্ট কাস্ট নির্দিষ্ট করুন:

Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));

5

২০০67 সালে এই পথে 4867608 নাম্বারযুক্ত একটি বাগ ফাইল করা হয়েছিল, যা এই ব্যাখ্যা দিয়ে "ঠিক করবে না" হিসাবে সমাধান করা হয়েছিল।

সামঞ্জস্যতার সীমাবদ্ধতার কারণে আমরা এটি পরিবর্তন করতে পারি না। নোট করুন যে এটি সর্বজনীন স্ট্যাটিক স্ট্রিংয়ের মান (অফ ডেটা []) পদ্ধতি যা শেষ হয়ে যায় এবং নাল আর্গুমেন্টের জন্য "নাল" প্রতিস্থাপনের কথা উল্লেখ করে না।

@ ###। ### 2003-05-23


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