জাভাতে নাল দিয়ে টাইপ করার সময় কোনও ব্যতিক্রম নেই


227
String x = (String) null;

কেন এই বিবৃতিতে কোনও ব্যতিক্রম নেই?

String x = null;
System.out.println(x);

এটি মুদ্রণ null। তবে .toString()পদ্ধতির উচিত নাল পয়েন্টার ব্যতিক্রম throw


আপনি কোন ব্যতিক্রম সম্পর্কে কথা বলছেন, সংকলক?
সাজান চন্দ্রন

উত্তর:


323

আপনি nullকোনও ব্যতিক্রম না পেয়ে যেকোন রেফারেন্স প্রকারে কাস্ট করতে পারেন ।

printlnপদ্ধতি নাল পয়েন্টার নিক্ষেপ না কারণ এটি প্রথম চেক বস্তুর নাল কি না কিনা। যদি নাল হয় তবে এটি স্ট্রিংটি প্রিন্ট করে "null"। অন্যথায় এটি toStringobject বস্তুর পদ্ধতিটি কল করবে ।

আরও বিশদ যুক্ত করা হচ্ছে:String.valueOf(object) ইনপুট অবজেক্টে অভ্যন্তরীণভাবে মুদ্রণ পদ্ধতিগুলি কল পদ্ধতিতে প্রিন্ট করুন। এবং valueOfপদ্ধতিতে, এই চেকটি নাল পয়েন্টার ব্যতিক্রম এড়াতে সহায়তা করে:

return (obj == null) ? "null" : obj.toString();

আপনার বাকী বিভ্রান্তির জন্য, কোনও নাল অবজেক্টে যে কোনও পদ্ধতি কল করা কোনও বিশেষ ক্ষেত্রে না হলে নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করা উচিত।


1
@ জুনেদআহসান কি বিশেষ কোন মামলাগুলির কারণে এটি এনপিই না ফেলেছে?
হলোয়ে

@ ট্রেনগোট নীচে পিটার উত্তরে উল্লিখিত একটি পরীক্ষা করুন।
জুনেদ আহসান

144

আপনি nullযে কোনও রেফারেন্স প্রকারে কাস্ট করতে পারেন । আপনি এমন পদ্ধতিগুলিতে কল করতে পারেন যা nullএকটি আর্গুমেন্ট হিসাবে পরিচালনা System.out.println(Object)করে, উদাহরণস্বরূপ , তবে আপনি কোনও nullমান উল্লেখ করতে এবং এটিতে কোনও পদ্ধতিতে কল করতে পারবেন না ।

বিটিডব্লিউ একটি জটিল পরিস্থিতি রয়েছে যেখানে এটি প্রদর্শিত হয় আপনি nullমানগুলিতে স্থির পদ্ধতিগুলি কল করতে পারেন ।

Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.

12
কি দারুন. যদি জিজ্ঞাসা করা হয়, আমি 100% নিশ্চিত যে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে। সত্যিই একটি জটিল ঘটনা।
ম্যাগনাইলেক্স

2
@ ম্যাগনাইলেক্স: একেবারে! এটি একটি সাধারণ ওসিপিজেপি পরীক্ষার কৌশল কৌশল।
সিসিপিজ্জা

3
এটি কি কারণ বাইটকোডে সংকলক t.yield() -> Thread.yeld() যেকোনভাবে এটি "অনুকূলিত করে" ? কীভাবে final int i = 1; while (i == 1)অপ্টিমাইজ করা হয় তার অনুরূপwhile(true)
এসজিএল

@ এসগাল এটি আরও উন্নত কারণ দ্বিতীয়টি অপটিমাইজেশন এএফআইএকে বাধ্যতামূলক নয় যখন প্রথমটি এক ধরনের।
পল স্টেলিয়ান

36

এটি নকশা দ্বারা। আপনি nullযে কোনও রেফারেন্স প্রকারে কাস্ট করতে পারেন । অন্যথায় আপনি এটিকে রেফারেন্স ভেরিয়েবলগুলিতে নির্ধারণ করতে সক্ষম হবেন না।


ধন্যবাদ! রেফারেন্স ভেরিয়েবলের নাল নির্ধারণের বিষয়ে এই নোটটি সত্যই সহায়ক!
সর্বোচ্চ

22

নিম্নলিখিত পদ্ধতিটি নির্মাণের জন্য নাল মানগুলি ingালাই করা প্রয়োজন যেখানে কোনও পদ্ধতি অতিরিক্ত লোড করা হয় এবং যদি নালগুলি এই ওভারলোডেড পদ্ধতিগুলিতে প্রেরণ করা হয় তবে সংকলকটি কীভাবে অস্পষ্টতা পরিষ্কার করতে জানে না তাই আমাদের এই ক্ষেত্রে নাল টাইপ করতে হবে:

class A {
  public void foo(Long l) {
    // do something with l
  }
  public void foo(String s) {
    // do something with s      
  }
}
new A().foo((String)null);
new A().foo((Long)null);

অন্যথায় আপনি আপনার প্রয়োজনীয় পদ্ধতিটি কল করতে পারেন নি।


বেশিরভাগ ক্ষেত্রে String bar = null;ingালাই অন্তর্নিহিত, যেমন nullমানটিকে কাস্ট করে String। এখনও পর্যন্ত আমি কেবল একটি পরীক্ষায় স্পষ্টভাবে নাল নিক্ষেপ করতে হয়েছিল যেখানে কোনও পদ্ধতি ওভারলোড হয়েছিল এবং নাল ইনপুট দিয়ে আমি এর আচরণটি পরীক্ষা করতে চেয়েছিলাম। তবুও, জেনে রাখা ভাল, আমি আপনার উত্তর পাওয়ার আগে আমি একই রকম উত্তর লিখতে চলেছিলাম।
ভ্ল্যাক

মজাদার ঘটনা: l instanceof Longএবং এই ক্ষেত্রে s instanceof Stringফিরে আসবে false
আটটিলা তানয়ি

7

Println(Object) ব্যবহারসমূহ String.valueOf()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Print(String) নাল চেক করে।

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}

5

এখানে অনেক উত্তর ইতিমধ্যে উল্লেখ আছে

আপনি যে কোনও রেফারেন্স ধরণের নਾਲ কাস্ট করতে পারেন

এবং

যদি আর্গুমেন্টটি নাল হয়, তবে "নাল" সমান একটি স্ট্রিং

আমি কোথায় আছি তা নির্দিষ্ট করে জাভা স্পেসিফিকেশনটি সন্ধান করেছি:

নাল রেফারেন্স সর্বদা নির্ধারিত বা কোনও রেফারেন্স টাইপের (.25.2, §5.3, §5.5) এ কাস্ট করা যেতে পারে।

যদি রেফারেন্সটি নাল হয় তবে এটি "নাল" স্ট্রিংয়ে রূপান্তরিত হয় (চারটি ASCII অক্ষর n, u, l, l)।


3

অন্যরা যেমন লিখেছেন, আপনি সবকিছুতে নালাকে ফেলে দিতে পারেন। সাধারণত, আপনার প্রয়োজন হবে না, আপনি লিখতে পারেন:

String nullString = null;

সেখানে theালাই না রেখে।

তবে এমন অনুষ্ঠানগুলি রয়েছে যেখানে এই জাতীয় বর্ণগুলি বোঝায়:

ক) আপনি যদি নিশ্চিত করতে চান যে একটি নির্দিষ্ট পদ্ধতি বলা হয়েছে, যেমন:

void foo(String bar) {  ... }
void foo(Object bar) {  ... }

যদি আপনি টাইপ করেন তবে এটি একটি পার্থক্য তৈরি করবে

foo((String) null) vs. foo(null)

খ) যদি আপনি কোড তৈরি করতে আপনার আইডিই ব্যবহার করতে চান; উদাহরণস্বরূপ আমি সাধারণত ইউনিট পরীক্ষা লিখছি:

@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
    new MyClassUnderTest((Whatever) null);
}

আমি টিডিডি করছি; এর অর্থ হ'ল "মাইক্লাসউন্ডারস্টেস্ট" বর্গটি সম্ভবত উপস্থিত নেই। এই কোডটি লিখে, আমি তারপরে প্রথমে নতুন ক্লাসটি তৈরি করতে আমার আইডিই ব্যবহার করতে পারি; এবং তারপরে একটি কনস্ট্রাক্টর উত্পাদন করতে "বাক্সের বাইরে" যাই হোক না কেন "যুক্তি" স্বীকার করুন - আইডিই আমার পরীক্ষা থেকে বুঝতে পারে যে কনস্ট্রাক্টর যা-ই হোক না কেন টাইপের ঠিক একটি যুক্তি গ্রহণ করা উচিত।


2

মুদ্রণ :

একটি বিষয় মুদ্রণ করুন। স্ট্রিং.ভালিউওফ (অবজেক্ট) পদ্ধতি দ্বারা উত্পাদিত স্ট্রিংটি বাইটে অনুবাদ করা হয়

মান :

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

এটি যখন বস্তুটি হয় তখন কেবল "নাল" মান সহ একটি স্ট্রিং ফিরিয়ে দেয় null


2

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

JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)

আমার এই কনস্ট্রাক্টরটি ব্যবহার করা দরকার, কারণ আমি গ্রাফিকস কনফিগারেশনটি সেট করতে চাই, তবে এই ডায়ালগটির জন্য আমার কোনও পিতামাতা নেই, তাই প্রথম যুক্তিটি বাতিল হওয়া উচিত। ব্যবহার

JDialog(null, String, boolean, Graphicsconfiguration) 

অস্পষ্ট, তাই এই ক্ষেত্রে আমি সমর্থিত ধরণের একটিতে নাল কাস্ট করে কলটি সংকীর্ণ করতে পারি:

JDialog((Frame) null, String, boolean, GraphicsConfiguration)

0

এই পরিস্থিতিতে এই ভাষার বৈশিষ্ট্যটি সুবিধাজনক।

public String getName() {
  return (String) memberHashMap.get("Name");
}

যদি সদস্য হ্যাশম্যাপ.জেট ("নাম") বাতিল করে দেয় তবে আপনি চাইবেন উপরের পদ্ধতিটি কোনও ব্যতিক্রম না ছুঁড়েই নালার দিকে ফিরে আসে। ক্লাসটি যাই হোক না কেন, নাল শূন্য হয়।

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