জাভাতে শূন্য করতে অবিচ্ছিন্ন বস্তু ভেরিয়েবল এবং অবজেক্ট ভেরিয়েবলকে আরম্ভ করার মধ্যে পার্থক্য কী


12

আমার নিম্নলিখিত দুটি অবজেক্ট ভেরিয়েবল রয়েছে

Date a;
Date b=null;

অবশ্যই 'এ' এবং 'বি' উভয়ই কোনও বস্তুর উল্লেখ করছেন না।

এখন যদি আমি নিম্নলিখিত বিবৃতি প্রার্থনা করি

System.out.println(a.toString());

একটি সংকলন সময় ত্রুটি থাকবে, আমি নীচের বিবৃতি যদি অনুরোধ করা হয়

System.out.println(b.toString());

সংকলনের সময় ত্রুটি থাকবে না তবে রানটাইম ত্রুটি থাকবে। এর কারণ কী এবং নাল মানটি উপস্থাপনের জন্য কোন মান আসলে 'বি' তে সংরক্ষণ করা হবে?


2
এসও-তে অনেকবার জিজ্ঞাসা ও উত্তর দেওয়া হয়েছিল: জাভাতে কেন স্থানীয় ভেরিয়েবলগুলি আরম্ভ করা হয় না? , জাভাতে একনীতিবিহীন ভেরিয়েবল এবং সদস্য এবং এর সাথে যুক্ত অনেক প্রশ্নের মধ্যে
gnat

@ জাগ্রত, অন্য কোনও প্রশ্ন কি "অবিচ্ছিন্ন" এবং "নাল" এর মধ্যে পার্থক্য মোকাবেলা করে? উত্তরটির সদৃশ হওয়ার অর্থ এই নয় যে এটি একটি সদৃশ প্রশ্ন।
ডগএম

@ ডগ নিশ্চিত, আমি যে প্রথম প্রশ্নটি উল্লেখ করেছি তা কি পড়েছেন? "জাভা ডিজাইনারদের কি মনে হয়েছিল যে স্থানীয় ভেরিয়েবলগুলিকে একটি ডিফল্ট মান দেওয়া উচিত নয়? গুরুতরভাবে, উদাহরণস্বরূপ যদি ভেরিয়েবলগুলিকে একটি ডিফল্ট মান দেওয়া যায় তবে কেন আমরা স্থানীয় ভেরিয়েবলগুলির জন্য একই ব্যবহার করতে পারি না?" (FWIW এটা হতে পারে না টেকনিক্যালি একটি ডুপ্লিকেট হতে, সহজভাবে কারণ এটি অন্য সাইট এ থাকবে)
মশা

1
এটি "আনইনটায়ালাইজড" এবং "শূন্য হিসাবে আরম্ভ করা" এর মধ্যে পার্থক্যটি চিহ্নিত করে না, কেবল "কেন ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে নাল হয়ে যায় না?" একই বিষয়, কিছুটা আলাদা প্রশ্ন।
ডগএম

উত্তর:


3

Thats কারণ স্থানীয় ভেরিয়েবলের রাজ্যটি এর পরিধিের মধ্যে নিয়ন্ত্রিত

 // method/loop/if/try-catch etc...
 {
   Date d; // if it's not intialised in this scope then its not intialised  anywhere
 }

ক্ষেত্রের ক্ষেত্রে যা হয় না

class Foo{
 Date d; // it could be intialised anywhere, so its out of control and java will set to null for you
}

এখন, কেন এটি স্থির করে একটি ভেরিয়েবলটি নালায় সেট করে তা অবিলম্বে ব্যবহার করতে? হতে পারে এটি একটি .তিহাসিক ভুল যা কখনও কখনও ভয়াবহ ভুলের দিকে পরিচালিত করে

 {
  Date d = null;
  try{
  }catch{ // hide it here 
  }
  return d;
 } 

এখন শব্দার্থক পার্থক্য কি?

Date d;

শুধু পরিবর্তনশীল যে প্রকারের একটি বস্তু যে পয়েন্ট রেফারেন্স বহন করতে পারে ঘোষণা Dateঅবশ্য

Date d= null; 

ঠিক একই কাজ করে তবে রেফারেন্সটি এখন নালার দিকে ইঙ্গিত করছে, নালটি কোনও রেফারেন্সের মতো, এটি একটি নেটিভ পয়েন্টারের স্থান নেয়, এটি 32-বিট মেশিনে 4 বাইট এবং 64-বিট মেশিনে 8 বাইট


এই নিছক পুনরাবৃত্তি বিন্দু তৈরি এবং একটি ব্যাখ্যা বলে মনে হয় পূর্বে উত্তর এক ঘন্টা আগে পোস্ট করা হয়েছে
মশা

@ জাগান আপনার মন্তব্যের জন্য ধন্যবাদ, তবে আমি মনে করি না, চিয়ার্স
স্লেমন জেনিদি

আপনার অর্থ কি নাল একটি স্মৃতিতে কোথাও সঞ্চিত একটি বস্তু এবং নাল দ্বারা নির্ধারিত সমস্ত অবজেক্ট ভেরিয়েবলগুলি নাল বস্তুর দিকে নির্দেশ করছে।
হরিশ_এন

@ হরিশ.এন না, আমি এটি বলিনি, আমি বলেছিলাম এটি একটি বিষয় এবং একটি বস্তু নয়
স্লেমন জেনিদি

উদাহরণস্বরূপ আপনি 'd' দিয়ে গেছেন একটি রেফারেন্স .. এটি টাইপ তারিখের কোনও অবজেক্টের রেফারেন্স ... একইভাবে নাল যদি একটি রেফারেন্স হয় .. এটি কোন বস্তুকে বোঝায় ..?
হরিশ_এন

19

শ্রেণীর ক্ষেত্রগুলির জন্য কোনও পার্থক্য নেই। এগুলি nullঅবজেক্টের জন্য 0, সংখ্যার মান এবং falseবুলিয়ানগুলির জন্য হয়।

পদ্ধতিগুলিতে ঘোষিত ভেরিয়েবলগুলির জন্য - জাভা তাদের প্রাথমিককরণ করা প্রয়োজন। এগুলি সূচনা না করা যখন তাদের অ্যাক্সেস করা হয় তখন একটি সংকলন সময় ত্রুটির কারণ হয়।

কি কারণ? শ্রেণি ক্ষেত্রগুলি যে কোনও পদ্ধতিতে পরিবর্তিত হতে পারে। যে কোনও ক্রমে পদ্ধতিটি চাওয়া হয়। সমস্ত বেসরকারী ক্ষেত্রগুলি অন্যান্য শ্রেণি এবং / বা শ্রেণিটি বর্ধমান ক্লাস দ্বারা সংশোধিত হতে পারে। অতএব, একটি অস্বীকৃত পরিবর্তনশীল সম্পর্কে অবহিত করার কোনও অর্থ নেই, যেহেতু এটি অনেকগুলি, অনেক জায়গায় নির্ধারিত হতে পারে।

পদ্ধতির অভ্যন্তরের ভেরিয়েবলগুলি স্থানীয় হয় এবং কেবলমাত্র পদ্ধতির ভিতরেই এটি পরিবর্তন করা যায়। সুতরাং সম্ভাব্য ভুলগুলি নির্দেশ করা উভয়ই সম্ভব এবং যুক্তিযুক্ত। এবং সংকলক এটি করার চেষ্টা করে। যদি এটি জানে ক্ষেত্রটি আরম্ভ হয় না, এটি একটি ত্রুটি দেখায়, কারণ এটি আপনি যা চান তা কখনই নয়। যদি এটি নিশ্চিত না হয় - তবে এটি একটি সতর্কতা দেবে, যাতে আপনি নিশ্চিত হন।

public static class Test {
    Date a; // ok 
    Date b = null; // ok

    public void test() {
        Date c;
        Date d = null;

        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString()); // error
        System.out.println(d.toString()); // warning
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.