কেন স্থানীয় ভেরিয়েবলগুলি জাভাতে আরম্ভ করা হয় না?


104

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

এবং এটি ব্লগ পোস্টে এই মন্তব্যে বর্ণিত সমস্যাগুলির দিকে নিয়ে যায় :

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

খুবই হতাশাজনক.



4
এর জন্য দুঃখিত ... আমি যখন প্রশ্নটি টাইপ করছিলাম তখন এই প্রশ্নটি পপআপ হয় নি .. তবে, আমি অনুমান করি যে দুটি প্রশ্নের মধ্যে পার্থক্য আছে ... আমি জানতে চাই যে জাভা ডিজাইনাররা কেন এটি এভাবে ডিজাইন করেছিলেন? আপনি যে প্রশ্নটির দিকে ইঙ্গিত করেছেন তা জিজ্ঞাসা করে না ...
শিবসুব্রাহ্মণিয়ান এ

আরও দেখুন: এই সংশ্লিষ্ট সি # টি প্রশ্নবোধক stackoverflow.com/questions/1542824/...
Raedwald

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

উত্তর:


62

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


23

আপনি যে "সমস্যা" এর সাথে লিঙ্ক করেছেন এটি মনে করছে এই পরিস্থিতিটি বর্ণনা করছে:

SomeObject so;
try {
  // Do some work here ...
  so = new SomeObject();
  so.DoUsefulThings();
} finally {
  so.CleanUp(); // Compiler error here
}

কমেন্টারের অভিযোগ হ'ল সংকলকটি finallyবিভাগটির লাইনে দাঁড়িয়ে আছে , দাবি করে যে soএটি অনিচ্ছাকৃত হতে পারে। মন্তব্যে কোডটি লেখার আরও একটি উপায় উল্লেখ করা হয়েছে, সম্ভবতঃ এরকম কিছু:

// Do some work here ...
SomeObject so = new SomeObject();
try {
  so.DoUsefulThings();
} finally {
  so.CleanUp();
}

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

যাইহোক, কোডের এই দ্বিতীয় সংস্করণটি এটি লেখার সঠিক উপায়। প্রথম সংস্করণে, সংকলকটির ত্রুটি বার্তাটি সঠিক ছিল। soপরিবর্তনশীল uninitialized করা হতে পারে। বিশেষত, যদি SomeObjectকনস্ট্রাক্টর ব্যর্থ হয়, soআরম্ভ করা হবে না, এবং তাই কল করার চেষ্টা করা ত্রুটি হবে so.CleanUp। আপনি বিভাগটি চূড়ান্ত করে এমন সংস্থানটি অর্জন করার পরে সর্বদা tryবিভাগটি প্রবেশ করুন ।finally

try- finallyপরে ব্লক soআরম্ভের আছে শুধুমাত্র রক্ষা করার জন্য SomeObjectউদাহরণস্বরূপ, কোন ব্যাপার কি আর ঘটবে নিশ্চিত করুন যে এটি পরিষ্কার পরার করতে। যদি অন্য কিছু চালানোর দরকার হয় তবে এগুলি সম্পর্কিত SomeObjectসম্পত্তি বরাদ্দকৃত কিনা তা সম্পর্কিত নয় , তবে তাদের অন্য একটিতে যেতে হবে try- finallyব্লক, সম্ভবত যেটি আমি দেখিয়েছি তাকে মোড়ানো।

ব্যবহারের আগে ভেরিয়েবলগুলি ম্যানুয়ালি বরাদ্দকরণের প্রয়োজন হলে প্রকৃত সমস্যা দেখা দেয় না। এটি কেবল সামান্য ঝামেলা বাড়ে তবে আপনার কোডটি এর জন্য আরও ভাল better আপনার কাছে আরও সীমিত সুযোগ সহ ভেরিয়েবল থাকবে এবং try- এমন finallyব্লকগুলি যা খুব বেশি সুরক্ষিত করার চেষ্টা করে না।

যদি স্থানীয় ভেরিয়েবলগুলির ডিফল্ট মান থাকে তবে soপ্রথম উদাহরণে এটি হত null। এটি আসলে কোনও সমস্যার সমাধান করতে পারত না। finallyব্লকে একটি সংকলন-সময় ত্রুটি পাওয়ার পরিবর্তে , আপনার NullPointerExceptionসেখানে লুকোচুরি থাকতে হবে যা কোডের "এখানে কিছু কাজ করুন" বিভাগে অন্য যে কোনও ব্যতিক্রম ঘটতে পারে তা লুকিয়ে রাখতে পারে। (বা finallyবিভাগগুলিতে ব্যতিক্রমগুলি স্বয়ংক্রিয়ভাবে পূর্ববর্তী ব্যতিক্রমগুলিতে শৃঙ্খলাবদ্ধ? আমার মনে নেই Even তবুও, সত্যিকারের পথে আপনার অতিরিক্ত ব্যতিক্রম হবে))


4
অবশেষে ব্লকটিতে কেন কেবল একটি (যদি! = নাল) থাকে না?
ইজব

এটি এখনও কম্পাইলার সতর্কতা / ত্রুটির কারণ ঘটাবে - আমি মনে করি না যে সংকলক বুঝতে পারে যে এটি পরীক্ষা করে (তবে আমি কেবল এটি মেমরি বন্ধ করে দিচ্ছি, পরীক্ষা করা হয়নি)।
চিই

6
আমি চেষ্টা করার আগে কেবল সামোবজেক্ট তাই = নাল রেখেছি এবং অবশেষে ধারাটিতে নাল চেক রেখেছি। এইভাবে কোনও সংকলক সতর্কতা থাকবে না।
জুহা সিরাজিলা

জটিল জিনিস কেন? চেষ্টা করুন অবশেষে এইভাবে ব্লক করুন, এবং আপনি ভেরিয়েবলের একটি বৈধ মান আছে তা জানেন। কোনও নাল-চেকিংয়ের দরকার নেই।
রব কেনেডি

4
রব, আপনার উদাহরণ "নতুন সামোবজেক্ট ()" সহজ এবং সেখানে কোনও ব্যতিক্রম উত্পন্ন করা উচিত নয়, তবে কলটি যদি ব্যতিক্রম উত্পন্ন করতে পারে তবে চেষ্টা-ব্লকের অভ্যন্তরে এটি ঘটানো আরও ভাল হবে যাতে এটি পরিচালনা করা যায়।
সারেল বোথা

12

তদুপরি, নীচের উদাহরণে সামোবজেক্ট নির্মাণের অভ্যন্তরে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হতে পারে, সেক্ষেত্রে 'সুতরাং' ভেরিয়েবলটি বাতিল হয়ে যাবে এবং ক্লিনআপে কলটি নালপয়েন্টার এক্সেকশন নিক্ষেপ করবে

SomeObject so;
try {
  // Do some work here ...
  so = new SomeObject();
  so.DoUsefulThings();
} finally {
  so.CleanUp(); // Compiler error here
}

আমি যা করতে চাই তা হ'ল:

SomeObject so = null;
try {
  // Do some work here ...
  so = new SomeObject();
  so.DoUsefulThings();
} finally {
  if (so != null) {
     so.CleanUp(); // safe
  }
}

12
আপনি বরং কি করবেন?
বৈদ্যুতিক সন্ন্যাস

4
হ্যাঁ, কুৎসিত হ্যাঁ, আমিও তাই করি।
এসএমবিগস

@ ইলেক্ট্রিকমনক আপনার মনে হয় কোন ফর্মটি আরও ভাল, আপনি যে চিত্রটি দেখিয়েছেন বা এটি এখানে getContents (..) পদ্ধতিতে দেখানো হয়েছে: জাভাপ্র্যাকটিসস
এটম

11

লক্ষ্য করুন যে চূড়ান্ত উদাহরণ / সদস্য ভেরিয়েবলগুলি ডিফল্টরূপে আরম্ভ হয় না। কারণ এগুলি চূড়ান্ত এবং পরে প্রোগ্রামে পরিবর্তন করা যাবে না। এ কারণেই যা জাভা তাদের জন্য কোনও ডিফল্ট মান দেয় না এবং প্রোগ্রামারটিকে এটি আরম্ভ করতে বাধ্য করে।

অন্যদিকে, চূড়ান্ত সদস্যবিহীন ভেরিয়েবলগুলি পরে পরিবর্তন করা যেতে পারে। অতএব সংকলকটি তাদের একচেটিয়াভাবে ছাড়তে দেয় না, অবিকল, কারণ সেগুলি পরে পরিবর্তন করা যায়। স্থানীয় ভেরিয়েবল সম্পর্কে, স্থানীয় ভেরিয়েবলের পরিধি অনেক সংকীর্ণ। কম্পাইলার কখন এটি ব্যবহার করা যায় তা জানে। অতএব, প্রোগ্রামারকে ভেরিয়েবলটি আরম্ভ করতে বাধ্য করা অর্থপূর্ণ হয়ে ওঠে।


9

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

অতিরিক্ত পদক্ষেপ নিচ্ছেন না কেন? একটি পদক্ষেপ ফিরে নিন - কেউই উল্লেখ করেনি যে এই ক্ষেত্রে "সতর্কতা" খুব ভাল জিনিস।

আপনার ভেরিয়েবলটি কখনই প্রথম পাসের শূন্য বা নাল থেকে শুরু করতে হবে না (যখন আপনি প্রথম কোডিং করছেন)। হয় এটিকে আসল মান হিসাবে নির্ধারণ করুন বা একেবারেই বরাদ্দ করবেন না কারণ যদি আপনি না করেন তবে জাভা আপনাকে বলতে পারে যখন আপনি সত্যিই স্ক্রু করবেন। একটি দুর্দান্ত উদাহরণ হিসাবে বৈদ্যুতিন সন্ন্যাসীর উত্তর নিন। প্রথম ক্ষেত্রে এটি আশ্চর্যজনকভাবে কার্যকর যে এটি আপনাকে বলছে যে চেষ্টাটি যদি () ব্যর্থ হয় কারণ সামোবজেক্টের কনস্ট্রাক্টর একটি ব্যতিক্রম ছুঁড়ে ফেলেছে তবে শেষ পর্যন্ত আপনি এনপিই দিয়ে শেষ করবেন। যদি কনস্ট্রাক্টর কোনও ব্যতিক্রম ছুঁড়তে না পারে তবে এটি চেষ্টা করা উচিত নয়।

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

তার উপরে, স্পষ্ট করে "ইনট সাইজ = 0" না বলে "ইনট সাইজ" এর পরিবর্তে এবং পরবর্তী প্রোগ্রামারটিকে এটি শূন্য করার ইচ্ছায় চিহ্নিত করা ভাল?

ফ্লিপ দিকে আমি একক বৈধ কারণ নিয়ে আসতে পারি না যে সংকলকটি সমস্ত অবিচ্ছিন্ন ভেরিয়েবলগুলি 0 এ আরম্ভ করার জন্য।


4
হ্যাঁ, এবং এমন আরও কিছু রয়েছে যেখানে কোডটি প্রবাহিত হওয়ার কারণে এটি কমবেশি শূন্য করতে হবে - এটি প্রতিফলিত করার জন্য উত্তরটি "কখনই" আপডেট করা উচিত ছিল না।
বিল কে

4

আমি মনে করি প্রাথমিক উদ্দেশ্যটি ছিল সি / সি ++ এর সাথে সাদৃশ্য বজায় রাখা। তবে সংকলক সনাক্তকরণ এবং অবিচ্ছিন্ন ভেরিয়েবলগুলি ব্যবহারের বিষয়ে আপনাকে সতর্ক করে যা সমস্যাটিকে ন্যূনতম বিন্দুতে হ্রাস করবে। পারফরম্যান্সের দৃষ্টিকোণ থেকে, আপনাকে অবিচ্ছিন্ন ভেরিয়েবলগুলি ঘোষণা করতে দেওয়া কিছুটা দ্রুততর কারণ আপনি পরবর্তী বিবৃতিতে ভেরিয়েবলের মানটি ওভাররাইট করলেও সংকলককে একটি অ্যাসাইনমেন্ট স্টেটমেন্ট লিখতে হবে না।


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

4
হ্যাঁ, তবে একটি যুক্তিযুক্ত হতে পারে যে এটি প্রোগ্রামারকে জানতে দেয় যে সে ভুলক্রমে ভেরিয়েবলটি অবিচ্ছিন্ন করে ফেলেছে কিনা।
মেহরদাদ আফশারি

4
সংকলক উভয় ক্ষেত্রেই এটি করতে পারে। :) ব্যক্তিগতভাবে, আমি পছন্দ করি যে সংকলকটি একটি অবিচ্ছিন্ন ভেরিয়েবলকে একটি ত্রুটি হিসাবে বিবেচনা করে। এর অর্থ আমি কোথাও ভুল করে থাকতে পারি।
গ্রেগ হিউগিল

আমি জাভা লোক নই, তবে আমি এটি পরিচালনা করার সি # পদ্ধতি পছন্দ করি। পার্থক্য সেই ক্ষেত্রে, সংকলকটি একটি সতর্কতা জারি করতে হয়েছিল, যা আপনাকে আপনার সঠিক প্রোগ্রামের জন্য কয়েকশ সতর্কতা পেতে পারে;)
মেহরদাদ আফশারি

এটি সদস্য ভেরিয়েবলের জন্যও সতর্ক করে?
আদিল আনসারী

4

(প্রশ্নের উত্তর পরে এতক্ষণে একটি নতুন উত্তর পোস্ট করা অদ্ভুত মনে হতে পারে, তবে একটি সদৃশ প্রকাশ পেয়েছে ))

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

এটি বলেছিল, আমি পুরোপুরি পিছনে যেতে পারি যে প্রয়োজনের ভেরিয়েবলগুলি সর্বদা সুস্পষ্টভাবে আরম্ভ করা হত; ত্রুটিটি এমন কোনও নির্মাণকারীর ক্ষেত্রে ঘটবে যেখানে ফলাফলটি একটি অবিচ্ছিন্ন উদাহরণ ভেরিয়েবলকে অনুমতি দেয় (উদাহরণস্বরূপ, ঘোষণায় আরম্ভ করা হয়নি এবং কনস্ট্রাক্টারে নয়)। তবে এটাই সিদ্ধান্ত নয় গোসলিং, ইত্যাদি। আল।, 90 এর দশকের গোড়ার দিকে নিয়ে গেছে, তাই আমরা এখানে আছি। (এবং আমি বলছি না যে তারা ভুল কল করেছে।)

যদিও আমি স্থানীয় ভেরিয়েবলগুলি ডিফল্ট করে তুলতে পারি না । হ্যাঁ, আমাদের যুক্তিটি ডাবল-চেক করার জন্য আমাদের সংকলকগুলির উপর নির্ভর করা উচিত নয় এবং একটিটি নয়, তবে সংকলকটি যখন বের করে তখন এটি কার্যকর। :-)


"এটি বলেছিল, আমি পুরোপুরি পিছনে যেতে পারি যে প্রয়োজনের ভেরিয়েবলগুলি সর্বদা সুস্পষ্টভাবে আরম্ভ করা হত ..." যা এফডাব্লুআইডাব্লু, তারা টাইপস্ক্রিপ্টে যে দিকটি নিয়েছিল is
টিজে ক্রাউডার

3

ভেরিয়েবল আরম্ভ না করা আরও দক্ষ এবং স্থানীয় ভেরিয়েবলের ক্ষেত্রে এটি করা নিরাপদ, কারণ প্রাথমিককরণটি সংকলক দ্বারা ট্র্যাক করা যায়।

যে ক্ষেত্রে আপনার প্রারম্ভিককরণের জন্য কোনও পরিবর্তনশীলের প্রয়োজন হয় আপনি সর্বদা এটি নিজেই করতে পারেন, সুতরাং এটি কোনও সমস্যা নয়।


3

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

উদাহরণস্বরূপ, নিম্নোক্ত সাধারণ কোডটি বিবেচনা করুন ... ( এনবি আসুন প্রজ্ঞাপনের উদ্দেশ্যে ধরে নেওয়া যাক যে স্থানীয় ভেরিয়েবলগুলি একটি স্পষ্টরূপে আরম্ভ না করা থাকলে একটি ডিফল্ট মান নির্ধারিত হয় )

System.out.println("Enter grade");
int grade = new Scanner(System.in).nextInt(); //I won't bother with exception handling here, to cut down on lines.
char letterGrade; //let us assume the default value for a char is '\0'
if (grade >= 90)
    letterGrade = 'A';
else if (grade >= 80)
    letterGrade = 'B';
else if (grade >= 70)
    letterGrade = 'C';
else if (grade >= 60)
    letterGrade = 'D';
else
    letterGrade = 'F';
System.out.println("Your grade is " + letterGrade);

যখন সমস্ত বলা হয় এবং হয়ে যায়, কম্পাইলার লেটারগ্র্যাডকে '\ 0' এর একটি ডিফল্ট মান নির্ধারণ করে ধরে নিলে এই কোডটি লিখিত হিসাবে সঠিকভাবে কাজ করবে। তবে, যদি আমরা অন্য বিবৃতিটি ভুলে যাই?

আমাদের কোডে একটি পরীক্ষার রান নিম্নলিখিত ফলাফল হতে পারে

Enter grade
43
Your grade is

এই ফলাফলটি প্রত্যাশিত হওয়ার পরে অবশ্যই কোডারের উদ্দেশ্য ছিল না। প্রকৃতপক্ষে, সম্ভবত বেশিরভাগ ক্ষেত্রে (বা কমপক্ষে একটি উল্লেখযোগ্য সংখ্যা, এর), ডিফল্ট মানটি পছন্দসই মান হবে না , সুতরাং বেশিরভাগ ক্ষেত্রেই ডিফল্ট মানটি ত্রুটির কারণ হতে পারে। এটা ব্যবহার করার পূর্বে একটি স্থানীয় পরিবর্তনশীল একটি প্রাথমিক মান দায়িত্ব অর্পণ করা, বিস্মরণ দ্বারা সৃষ্ট ডিবাগ বিষাদ থেকে সংকেতপদ্ধতিরচয়িতা বলপূর্বক আরো ইন্দ্রিয় তোলে = 1মধ্যে for(int i = 1; i < 10; i++)এ পর্যন্ত অন্তর্ভুক্ত করা হচ্ছে না এ সুবিধার outweighs = 0মধ্যে for(int i; i < 10; i++)

এটি সত্য যে চেষ্টা-শেষ অবধি ব্লকগুলি কিছুটা অগোছালো হয়ে উঠতে পারে (তবে এটি উদ্ধৃত হিসাবে মনে হচ্ছে বাস্তবে এটি ক্যাচ -২২ নয়), উদাহরণস্বরূপ যখন কোনও অবজেক্ট তার কনস্ট্রাক্টরে একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলে, তবে একটির জন্য কারণ বা অন্য কোনওটি, অবশেষে ব্লকের শেষে এই অবজেক্টটির জন্য কিছু করা উচিত । সম্পদের সাথে কাজ করার সময় এর একটি নিখুঁত উদাহরণ হ'ল যা অবশ্যই বন্ধ করা উচিত।

অতীতে হ্যান্ডেল করার একটি উপায় এর মতো হতে পারে ...

Scanner s = null; //declared and initialized to null outside the block. This gives us the needed scope, and an initial value.
try {
    s = new Scanner(new FileInputStream(new File("filename.txt")));
    int someInt = s.nextInt();
} catch (InputMismatchException e) {
    System.out.println("Some error message");
} catch (IOException e) {
    System.out.println("different error message"); 
} finally {
    if (s != null) //in case exception during initialization prevents assignment of new non-null value to s.
        s.close();
}

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

try (Scanner s = new Scanner(new FileInputStream(new File("filename.txt")))) {
...
...
} catch(IOException e) {
    System.out.println("different error message");
}

এটি বলেছিল, (নাম হিসাবে বোঝা যায়) এটি কেবল সংস্থানগুলির সাথে কাজ করে।

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

এটি সত্য যে ক্ষেত্রগুলি একটি ডিফল্ট মান থেকে শুরু হয় তবে এটি কিছুটা আলাদা। আপনি যখন উদাহরণস্বরূপ বলবেন, int[] arr = new int[10];আপনি এই অ্যারেটি শুরু করার সাথে সাথে অবজেক্টটি কোনও নির্দিষ্ট স্থানে মেমরিতে উপস্থিত থাকে। আসুন এক মুহুর্তের জন্য ধরে নেওয়া যাক যে কোনও ডিফল্ট মান নেই, তবে পরিবর্তে প্রাথমিক মানটি 1 ম এবং 0 এর যে কোনও সিরিজ এই মুহুর্তে সেই মেমরি লোকেশনে ঘটে। এটি বেশ কয়েকটি ক্ষেত্রে অ-নিরস্তাত্মক আচরণের দিকে পরিচালিত করতে পারে।

মনে করুন আমাদের কাছে ...

int[] arr = new int[10];
if(arr[0] == 0)
    System.out.println("Same.");
else
    System.out.println("Not same.");

এটি পুরোপুরি সম্ভব হবে যা Same.এক দৌড়ে Not same.প্রদর্শিত হতে পারে এবং অন্য কোনওটিতে প্রদর্শিত হতে পারে। আপনি একবার রেফারেন্স ভেরিয়েবলগুলি কথা বলা শুরু করলে সমস্যাটি আরও মারাত্মক হয়ে উঠতে পারে।

String[] s = new String[5];

সংজ্ঞা অনুসারে, s এর প্রতিটি উপাদান একটি স্ট্রিংকে নির্দেশ করা উচিত (বা নাল)। যাইহোক, প্রাথমিক মান যদি 0 ম এবং 1 এর ধারাবাহিকতায় এই মেমরির স্থানে ঘটে থাকে তবে প্রতিবার একই ফলাফল পাবেন এমন কোনও গ্যারান্টি নেই তবে অবজেক্টের [0] পয়েন্টের কোনও গ্যারান্টি নেই to (এটি অর্থপূর্ণ কোনও কিছুর দিকে লক্ষ্য করে) এমনকি এটি একটি স্ট্রিং (সম্ভবত এটি একটি খরগোশ ,: পি )! প্রকারের জন্য উদ্বেগের এই অভাবটি জাভা জাভা তৈরি করে এমন অনেক কিছুর মুখে উড়ে যাবে। সুতরাং স্থানীয় ভেরিয়েবলের জন্য ডিফল্ট মানগুলি সর্বোত্তমভাবে alচ্ছিক হিসাবে দেখা যেতে পারে, উদাহরণস্বরূপ ভেরিয়েবলগুলির জন্য ডিফল্ট মানগুলি একটি প্রয়োজনীয়তার কাছাকাছি ।


1

যদি আমি ভুল না হয় তবে অন্য একটি কারণ হতে পারে

সদস্য ভেরিয়েবলের ডিফল্ট মান প্রদান করা শ্রেণি লোডের অংশ

জাভাতে ক্লাস লোডিং একটি রান টাইম জিনিস মানে যখন আপনি কোনও বস্তু তৈরি করেন তখন শ্রেণিটি লোড করা হয় শ্রেণি লোডিংয়ের সাথে কেবল সদস্য ভেরিয়েবলগুলি আরম্ভ করা হয় ডিফল্ট মান দিয়ে JVM আপনার স্থানীয় ভেরিয়েবলগুলিকে ডিফল্ট মান দিতে সময় নেয় না কারণ কিছু পদ্ধতি কখনই হবে না কল করা হয় কারণ পদ্ধতি কলটি শর্তযুক্ত হতে পারে তাই তাদের ডিফল্ট মান দেওয়ার জন্য কেন সময় দিন এবং যদি এই ডিফল্টগুলি কখনই ব্যবহার না করা হয় তবে কার্যকারিতা হ্রাস করুন।


0

এমনকি গ্রহন আপনাকে অবিচ্ছিন্ন ভেরিয়েবলের সতর্কতা দেয়, সুতরাং যাইহোক এটি বেশ স্পষ্ট হয়ে ওঠে। ব্যক্তিগতভাবে আমি মনে করি এটি একটি ভাল জিনিস এটি ডিফল্ট আচরণ, অন্যথায় আপনার অ্যাপ্লিকেশনটি অপ্রত্যাশিত মান ব্যবহার করতে পারে এবং সংকলকটি ত্রুটি ছুঁড়ে দেওয়ার পরিবর্তে এটি কিছুই করবে না (তবে সম্ভবত একটি সতর্কতা দেবে) এবং তারপরে আপনি স্ক্র্যাচিংয়ের কাজ করবেন you'll আপনার মাথা কেন নির্দিষ্ট জিনিসগুলি যেমন করা উচিত তেমন আচরণ করে না।


0

স্থানীয় ভেরিয়েবলগুলি একটি স্ট্যাকের মধ্যে সংরক্ষণ করা হয়, তবে উদাহরণের ভেরিয়েবলগুলি গাদাতে সংরক্ষিত থাকে, তাই কিছু সম্ভাবনা রয়েছে যে স্ট্যাকের পূর্বের মানটি ডিফল্ট মানের পরিবর্তে পড়বে যেমন গাদা হয়। যে কারণে jvm এটিকে আরম্ভ না করে স্থানীয় ভেরিয়েবল ব্যবহার করার অনুমতি দেয় না।


4
ফ্ল্যাট আউট ভুল ... সমস্ত জাভা অ-
আদিমগুলি

জাভা 7 এর আগে, দৃষ্টান্তের ভেরিয়েবলগুলি হিপে সংরক্ষণ করা হয় এবং স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের মধ্যে পাওয়া যায়। তবে, স্থানীয় ভেরিয়েবলের উল্লেখগুলি যে কোনও বস্তুটি হিপগুলিতে পাওয়া যাবে। জাভা 7 হিসাবে, "জাভা হটস্পট সার্ভার সংকলক" "এস্কেপ অ্যানালাইসিস" সম্পাদন করতে পারে এবং স্তূপের জায়গায় স্তূপের পরিবর্তে কিছু বস্তু বরাদ্দ করার সিদ্ধান্ত নিতে পারে।
mamills

0

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


-1

উত্তরটি হল উদাহরণস্বরূপ ভেরিয়েবলগুলি ক্লাস কন্সট্রাক্টর বা যে কোনও শ্রেণি পদ্ধতিতে আরম্ভ করা যেতে পারে, তবে স্থানীয় ভেরিয়েবলের ক্ষেত্রে, আপনি ক্লাসে চিরকাল স্থায়ী পদ্ধতিতে যা কিছু নির্ধারণ করেন।


-2

আমি 2 কারণ অনুসরণ করতে পারে চিন্তা করতে পারে

  1. বেশিরভাগ উত্তরে যেমন স্থানীয় ভেরিয়েবল শুরু করার সীমাবদ্ধতা রেখে বলা হয়েছে, এটি নিশ্চিত করা হয় যে স্থানীয় পরিবর্তনশীল একটি প্রোগ্রাম নির্ধারিত হিসাবে নির্ধারিত হয় এবং প্রত্যাশিত ফলাফল গণনা করা নিশ্চিত করে।
  2. স্থানীয় ভেরিয়েবল (একই নাম) ঘোষণা করে দৃষ্টান্তের ভেরিয়েবলগুলি আড়াল করা যায় - প্রত্যাশিত আচরণটি নিশ্চিত করতে, স্থানীয় ভেরিয়েবলগুলি একটি মান শুরু করতে বাধ্য হয়। (যদিও এটি পুরোপুরি এড়ানো হবে)

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

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