একটি অ-শূন্য পদ্ধতিতে সংকলনে রিটার্নের বিবৃতি হারিয়েছে


189

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

public int doNotReturnAnything() {
    while(true) {
        //do something
    }
    //no return statement
}

আমি যদি লুপটিতে ব্রেক স্টেটমেন্ট (এমনকি শর্তসাপেক্ষও) যোগ করি তবে সংকলক কুখ্যাত ত্রুটিগুলির অভিযোগ করে: Method does not return a valueএকিপ্লেসে এবং Not all code paths return a valueভিজ্যুয়াল স্টুডিওতে।

public int doNotReturnAnything() {
    while(true) {
        if(mustReturn) break;
        //do something
    }
    //no return statement
}

এটি জাভা এবং সি # উভয়ের ক্ষেত্রেই সত্য।


3
দুর্দান্ত প্রশ্ন। আমি এর কারণ সম্পর্কে আগ্রহী হতে চাই।
এরিক শিয়েরবুম

18
একটি অনুমান: এটি একটি অসীম লুপ, সুতরাং একটি রিটার্ন নিয়ন্ত্রণ প্রবাহ অপ্রাসঙ্গিক?
লিউস থেরিন

5
"কেন কোনও ভাষা আমাদেরকে একটি শূন্যপদ্ধতিহীন পদ্ধতি রাখার অনুমতি দেয় যাতে অসীম লুপ থাকে এবং কিছু ফেরত না দেয়?" <- আপাতদৃষ্টিতে বোকা হওয়ার সময়, প্রশ্নটিও বিপরীত হতে পারে: কেন এটি অনুমতি দেওয়া হবে না? এই প্রকৃত কোড, উপায়?
fge

3
জাভা জন্য, আপনি এই উত্তরে একটি দুর্দান্ত ব্যাখ্যা খুঁজে পেতে পারেন ।
কেপিল

4
অন্যরা যেমন বুঝিয়েছে, এটি লুপটি অসীম তা জানার জন্য কম্পাইলার যথেষ্ট স্মার্ট। নোট যদিও কম্পাইলার না শুধুমাত্র অনুমতি দেয় আগমন অনুপস্থিত থাকতে, এটা enforces কারণ এটা কোন কিছুই জানে পর লুপ পাওয়া যাচ্ছে না। অন্তত নেটবিনে, এটি আক্ষরিকভাবে অভিযোগ করবে লুপের পরে কিছুunreachable statement আছে কিনা ।
শুক্রবার

উত্তর:


240

কোনও ভাষা কেন আমাদেরকে একটি অ-শূন্য পদ্ধতিতে অসীম লুপ রাখার অনুমতি দেয় এবং কিছু ফেরত দেয় না?

অকার্যকর পদ্ধতির নিয়ম হ'ল প্রতিটি কোড পাথ যা প্রত্যাবর্তন করতে হবে অবশ্যই একটি মান ফিরিয়ে দিতে হবে এবং সেই নিয়মটি আপনার প্রোগ্রামে সন্তুষ্ট: শূন্য কোডের পাথের মধ্যে শূন্য যা একটি মান দেয় না। নিয়মটি "প্রতিটি অ-শূন্য পদ্ধতিতে অবশ্যই একটি কোড পাথ অবশ্যই ফিরে আসে" is

এটি আপনাকে স্টাব-পদ্ধতিগুলি লিখতে সক্ষম করে:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    throw new NotImplementedException(); 
}

এটি একটি অকার্যকর পদ্ধতি। এটা তোলে হয়েছে অর্ডার ইন্টারফেস সন্তুষ্ট করার জন্য একটি অ অকার্যকর পদ্ধতি যাবে। তবে এই প্রয়োগটি অবৈধ করা বোকামি বলে মনে হচ্ছে কারণ এটি কোনও কিছুই ফেরায় না।

আপনার পদ্ধতির একটি অ্যাক্সেসযোগ্য পয়েন্ট রয়েছে কারণ একটি goto(মনে রাখবেন, while(true)এটি একটি আরও মনোজ্ঞ উপায় লেখার gotoপরিবর্তে) পরিবর্তে একটি throw(যা অন্যরকম রূপ goto) প্রাসঙ্গিক নয়।

সংকলক এমনকি কিছু ফেরত দেওয়ার বিষয়ে সতর্ক করে না কেন?

কারণ সংকলকটির কোডটি ভুল হওয়ার কোনও ভাল প্রমাণ নেই। কেউ লিখেছেন while(true)এবং সম্ভবত মনে হয় যে যে ব্যক্তি এটি করেছিল সে জানত যে তারা কী করছে।

C # তে পুনরায় ব্যবহারযোগ্যতা বিশ্লেষণ সম্পর্কে আমি আরও কোথায় পড়তে পারি?

বিষয়টিতে আমার নিবন্ধগুলি দেখুন, এখানে:

এটিবিজি: ডি ফ্যাক্টো এবং ডি জুর রিএ্যাচিবিলিটি

এবং আপনি সি # স্পেসিফিকেশন পড়া বিবেচনা করতে পারেন।


সুতরাং কেন এই কোডটি সংকলনের সময় ত্রুটি দেয়: public int doNotReturnAnything() { boolean flag = true; while (flag) { //Do something } //no return } এই কোডটিতে একটি ব্রেক পয়েন্টও নেই। সুতরাং এখন সংকলক কোডটি কীভাবে জানে তা ভুল।
সন্দীপ পুনিয়া

@ সন্দীপপুনিয়া: আপনি অন্যান্য উত্তরগুলি এখানে পড়তে চাইতে পারেন ... সংকলকটি কেবলমাত্র কিছু শর্ত সনাক্ত করতে পারে।
ড্যানিয়েল হিলগারথ

9
@ সন্দীপপুনিয়া: রানিয়াস সময়ে বুলিয়ান পতাকা পরিবর্তন করা যেতে পারে, যেহেতু এটি কোনও কনস্ট নয়, সুতরাং লুপটি অনন্ত নয়।
শ্মুলি

9
@SandeepPoonia: ইন সি # স্পেসিফিকেশন বলছেন যে if, while, for, switch, ইত্যাদি শাখাবিন্যাস নির্মান যে কাজ ধ্রুবক কম্পাইলার দ্বারা নিঃশর্ত শাখা হিসাবে গণ্য করা হয়। ধ্রুবক অভিব্যক্তির সঠিক সংজ্ঞাটি অনুমিত হয়। আপনার প্রশ্নের উত্তর নির্দিষ্টকরণে রয়েছে; আমার পরামর্শ আপনি এটি পড়তে হয়।
এরিক লিপার্ট

1
Every code path that returns must return a valueসর্বোত্তম উত্তর. উভয় প্রশ্নের স্পষ্টভাবে ঠিকানা। ধন্যবাদ
cPu1

38

জাভা সংকলকটি অ্যাক্সেসযোগ্য কোড ( whileলুপের পরে কোড ) সন্ধানের জন্য যথেষ্ট স্মার্ট

এবং তার পর থেকে অনধিগম্য , কোন বিন্দু একটি যুক্ত করতে returnসেখানে বিবৃতি (পরে whileপ্রান্ত)

একই শর্তসাপেক্ষে যায় if

public int get() {
   if(someBoolean) {   
     return 10;
   }
   else {
     return 5;
   }
   // there is no need of say, return 11 here;
}

যেহেতু বুলিয়ান শর্তটি someBooleanকেবলমাত্র উভয়ই মূল্যায়ন করতে পারে trueবা falseতার পরে return স্পষ্টভাবে সরবরাহ করার দরকার নেই if-else, কারণ সেই কোডটি অ্যাক্সেসযোগ্য এবং জাভা এটি সম্পর্কে কোনও অভিযোগ করে না।


4
আমি মনে করি না যে এটি সত্যই প্রশ্নের সমাধান করে। এইটি উত্তর দেয় যে কেন আপনার কাছে returnঅ্যাক্সেসযোগ্য কোডে কোনও return বিবৃতি প্রয়োজন নেই, তবে কেন আপনাকে অপি কোডটিতে কোনও বিবৃতি দরকার নেই তা নিয়ে কিছুই করার নেই ।
ববসন

জাভা সংকলক যদি না পৌঁছনীয় কোড (লুপের পরে কোড) সন্ধানের জন্য যথেষ্ট স্মার্ট হয় তবে নীচের এই কোডগুলি সংকলন করে কেন, উভয়ের কাছেই অ্যাক্সেসযোগ্য কোড রয়েছে তবে পদ্ধতিটি যদি একটি রিটার্ন বিবৃতি প্রয়োজন তবে কিছুক্ষণের সাথে পদ্ধতিটি হয় না। public int doNotReturnAnything() { if(true){ System.exit(1); } return 11; } public int doNotReturnAnything() { while(true){ System.exit(1); } return 11;// Compiler error: unreachable code }
সন্দীপ পুনিয়া

@ সন্দীপপুনিয়া: কারণ সংকলক জানে না যে System.exit(1)প্রোগ্রামটি মেরে ফেলবে। এটি কেবলমাত্র অ্যাক্সেসযোগ্য কোডের নির্দিষ্ট ধরণের সনাক্ত করতে পারে।
ড্যানিয়েল হিলগারথ

@ ড্যানিয়েল হিলগারথ: ওকে সংকলক জানে না System.exit(1)যে প্রোগ্রামটি মেরে ফেলবে, আমরা যে কোনওটি ব্যবহার করতে পারি return statement, এখন সংকলকটি সনাক্ত করে return statements। এবং আচরণ একই, ফিরে জন্য প্রয়োজন if conditionকিন্তু না while
সন্দীপ পুনিয়া

1
যেমন একটি বিশেষ ক্ষেত্রে ব্যবহার না করেই অনধিগম্য অধ্যায় ভালো বিক্ষোভেরwhile(true)
ম্যাথু

17

সংকলক জানে যে whileলুপ কখনই সম্পাদন বন্ধ করে না, সুতরাং পদ্ধতিটি কখনই শেষ হবে না, সুতরাং returnবিবৃতি প্রয়োজন হয় না।


13

প্রদত্ত আপনার লুপটি একটি ধ্রুবককে কার্যকর করে চলেছে - সংকলক জানে যে এটি একটি অসীম লুপ - অর্থ এই পদ্ধতিটি আর কোনওভাবেই ফিরে আসতে পারে না।

আপনি যদি কোনও ভেরিয়েবল ব্যবহার করেন - সংকলক বিধিটি প্রয়োগ করবে:

এটি সংকলন করবে না:

// Define other methods and classes here
public int doNotReturnAnything() {
    var x = true;

    while(x == true) {
        //do something
    }
    //no return statement - won't compile
}

তবে যদি "কিছু করা" কোনওভাবেই x সংশোধন করার সাথে জড়িত না .. তবে সংকলকটি এটি স্মরণ করার মতো স্মার্ট নয়?
বম

না - এটার মতো দেখাচ্ছে না।
ডেভ বিশে

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

@ মাইকএফএইএইপি, বিতর্ক করছেন না।
লিউস থেরিন

1
আমি ভুল হতে পারি তবে কিছু ডিবাগার ভেরিয়েবল পরিবর্তন করার অনুমতি দেয়। এখানে কোড দ্বারা x টি সংশোধন করা হয়নি এবং এটি জেআইটি কর্তৃক অপ্টিমাইজ হবে যখন কেউ এক্সকে মিথ্যাতে সংশোধন করতে পারে এবং পদ্ধতিতে কোনও কিছু ফেরত দেওয়া উচিত (যদি এই জাতীয় জিনিস সি # ডিবাগার দ্বারা অনুমোদিত হয়)।
ম্যাকিয়েজ পাইচোতকা

11

জাভা স্পেসিফিকেশন বলা একটি ধারণা সংজ্ঞায়িত করে Unreachable statements। আপনার কোডে অ্যাক্সেসযোগ্য বক্তব্য আপনার অনুমোদিত নয় (এটি একটি সংকলন সময় ত্রুটি)। এমনকি কিছুক্ষণের পরে (সত্য) পরে আপনাকে রিটার্ন বিবৃতি দেওয়ারও অনুমতি নেই; জাভা বিবৃতি। একটি while(true);বিবৃতি সংজ্ঞায়িত নিম্নলিখিত বিবৃতিগুলি অ্যাক্সেসযোগ্য করে তোলে, সুতরাং আপনার returnবিবৃতি প্রয়োজন নেই ।

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


7

আপনার whileলুপটি অসীম তা খুঁজে পেতে সংকলকটি যথেষ্ট স্মার্ট ।

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

সুতরাং, আপনার প্রশ্নের উত্তর দিতে:

সংকলকটি আপনার কোডটিকে বিশ্লেষণ করে এবং এটি নির্ধারণের পরে যে কোনও কার্যকরকরণের পথটি ঠিক আছে তা শেষ করে ফাংশনটি শেষ করে দেয় leads

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


7

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

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

যে কোনও ক্ষেত্রে, সুস্পষ্ট ধরণের তত্ত্বের মাধ্যমে বা না করে, সংকলক (সংকলক লেখক) স্বীকৃতি দেয় যে নন-টার্মিনেটিং স্টেটমেন্টের পরে কোনও রিটার্ন মান জিজ্ঞাসা করা নির্বোধ: এমন কোনও সম্ভাব্য ক্ষেত্রে নেই যেখানে আপনার সেই মানটির প্রয়োজন হতে পারে। (আপনার সংকলকটি আপনাকে কোনও সতর্কতা অবলম্বন করতে না পারলে আপনাকে সতর্ক করে বলা ভাল হতে পারে তবে মনে হচ্ছে আপনি এটি কোনও কিছু ফিরিয়ে দিতে চান But তবে স্টাইল-চেকারদের কাছে এটি একটি ভাল লিন্টের চেয়ে ভাল বাকি রয়েছে, কারণ আপনার টাইপ স্বাক্ষরের প্রয়োজন হতে পারে যে অন্য কোনও কারণে উপায় (যেমন সাবক্লাসিং) তবে আপনি সত্যই অবসান চান want


6

উপযুক্ত মান না দিয়ে ফাংশনটি শেষের দিকে পৌঁছতে পারে এমন কোনও পরিস্থিতি নেই। অতএব, কম্পাইলার সম্পর্কে অভিযোগ করার মতো কিছুই নেই।


5

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

পিএইচপি-র মতো আপনার ফেরতের ধরণটি সত্য যদি আপনি কোনও কিছু না ফেরান। কিছুই ফিরে না পেয়ে কম্পাইলার 1 পান।

এই হিসাবে

public int doNotReturnAnything() {
    while(true) {
        //do something
    }
    //no return statement
}

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

তবে ভিএস এর ক্ষেত্রে নয় এটি আপনাকে স্ট্যাকের একটি ত্রুটি ফিরিয়ে দেবে।


4

আপনার সময় লুপ চিরকালের জন্য চলবে এবং তাই বাইরে যখন আসে না; এটি কার্যকর করা চালিয়ে যাবে। সুতরাং, while while এর বাইরের অংশটি অ্যাক্সেসযোগ্য এবং রিটার্ন রিটার্ন করার বা পয়েন্ট করার কোনও অর্থ নেই। কোন অংশটি পৌঁছনীয় এবং কোন অংশটি নয় তা নির্ধারণ করার জন্য সংকলকটি যথেষ্ট বুদ্ধিমান।

উদাহরণ:

public int xyz(){
    boolean x=true;

    while(x==true){
        // do something  
    }

    // no return statement
}

উপরের কোডটি সংকলন করবে না, কারণ এমন কেস হতে পারে যে ভেরিয়েবল এক্সের মানটি লুপের বুকের অভ্যন্তরে পরিবর্তিত হবে। সুতরাং এটি লুপের বাইরে পৌঁছনোর বাইরে! এবং তাই সংকলক একটি ত্রুটি 'কোন রিটার্ন বিবৃতি পাওয়া যায় নি' ফেলে দেবে।

সংকলকটি যথেষ্ট পরিমাণে বুদ্ধিমান নয় (বা বরং অলস;)) এটি নির্ধারণ করতে যে x এর মান পরিবর্তন করা হবে কিনা। আশা করি এটি সবকিছু মুছে ফেলেছে।


7
এটি আসলে এই ক্ষেত্রে সংকলক যথেষ্ট স্মার্ট হওয়ার প্রশ্ন নয়। সি # 2.0 তে সংকলকটি জানার জন্য যথেষ্ট স্মার্ট ছিল যে int x = 1; while(x * 0 == 0) { ... }এটি একটি অসীম লুপ ছিল, তবে স্পেসিফিকেশনটি বলে যে লুপ এক্সপ্রেশনটি স্থির থাকে তখন সংকলকটি কেবল নিয়ন্ত্রণ প্রবাহ ছাড়িয়ে নেওয়া উচিত , এবং স্পেসিফিকেশনটি কোনও চলকবিহীন হিসাবে একটি ধ্রুবক অভিব্যক্তি সংজ্ঞায়িত করে । সংকলক তাই খুব স্মার্ট ছিল । সি # 3 তে আমি সংকলকটি স্পেসিফিকেশনের সাথে মিলিয়েছি এবং তার পর থেকে ইচ্ছাকৃতভাবে এই ধরণের অভিব্যক্তিগুলি সম্পর্কে কম স্মার্ট।
এরিক লিপার্ট

4

"সংকলক এমনকি কেন কিছু ফেরত দেওয়ার বিষয়ে সতর্ক করে না? বা কোনও ভাষা কেন আমাদের একটি অসীম পদ্ধতিতে একটি অসীম লুপ রাখার অনুমতি দেয় এবং কিছু ফেরত দেয় না?"।

এই কোডটি অন্যান্য সমস্ত ভাষায়ও বৈধ (সম্ভবত হাস্কেল বাদে!)। কারণ প্রথম অনুমানটি হ'ল আমরা "ইচ্ছাকৃতভাবে" কিছু কোড লিখছি।

এবং এমন পরিস্থিতিতে আছে যে এই কোডটি সম্পূর্ণরূপে বৈধ হতে পারে যদি আপনি এটি একটি থ্রেড হিসাবে ব্যবহার করতে যাচ্ছেন; অথবা যদি এটি কোনও ফেরত আসছিল Task<int>, আপনি ফিরে আসা মানটির উপর ভিত্তি করে কিছু ত্রুটি পরীক্ষা করতে পারেন - যা ফেরত দেওয়া উচিত নয়।


3

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


1

এর জন্য জাভা মামলার সুনির্দিষ্ট বিবরণগুলি (যা সম্ভবত সি # কেসের সাথে খুব মিল রয়েছে) জাভা সংকলক কীভাবে কোনও পদ্ধতিতে ফিরে আসতে সক্ষম কিনা তা নির্ধারণ করে with

বিশেষ করে, নিয়ম আছে যে একটি রিটার্ন টাইপ সঙ্গে একটি পদ্ধতি করতে সক্ষম নাও হতে হবে স্বাভাবিকভাবে সম্পন্ন এবং এর পরিবর্তে সবসময় সম্পূর্ণ করতে হবে আচমকা (হঠাৎ এখানে একটি ফিরতি বিবৃতি অথবা একটি ব্যতিক্রম মাধ্যমে ইঙ্গিত) প্রতি JLS 8.4.7

যদি কোনও পদ্ধতির রিটার্নের ধরণ হিসাবে ঘোষণা করা হয়, তবে পদ্ধতিটির শরীরে স্বাভাবিকভাবে সম্পূর্ণ করতে পারলে একটি সংকলন-সময় ত্রুটি ঘটে। অন্য কথায়, একটি রিটার্ন টাইপ সহ একটি পদ্ধতি অবশ্যই একটি রিটার্ন স্টেটমেন্ট ব্যবহার করে ফিরে আসতে হবে যা একটি মান ফেরত সরবরাহ করে; এটিকে "এর শরীরের শেষটি ফেলে দেওয়ার" অনুমতি দেওয়া হয় না

সংকলক জেএলএস 14.21 অ্যাক্সেসযোগ্য বিবৃতিতে সংজ্ঞায়িত নিয়মের উপর ভিত্তি করে সাধারণ সমাপ্তি সম্ভব কিনা তা দেখতে পারা যায় কারণ এটি সাধারণ সমাপ্তির জন্য বিধিগুলিও সংজ্ঞায়িত করে।

উল্লেখযোগ্যভাবে, অ্যাক্সেসযোগ্য বক্তব্যগুলির নিয়মগুলি কেবল এমন লুপগুলির জন্য বিশেষ কেস তৈরি করে যাগুলির একটি সংজ্ঞায়িত trueধ্রুবক প্রকাশ থাকে:

নীচে অন্তত একটি সত্য হলে বিবৃতিটি সাধারণত সম্পূর্ণ হতে পারে:

  • সময় বিবৃতিটি পৌঁছনীয় এবং শর্তটি প্রকাশটি মান সত্য সহ ধ্রুবক অভিব্যক্তি (.215.28) নয়।

  • অ্যাক্সেসযোগ্য ব্রেক স্টেটমেন্ট আছে যা সেই সময়ের স্টেটমেন্ট থেকে বেরিয়ে যায়।

সুতরাং যদি whileবিবৃতিটি স্বাভাবিকভাবে সম্পূর্ণ হতে পারে , তবে কোডটির নীচে পৌঁছনীয় বলে বিবেচিত হওয়ায় এর নীচে একটি রিটার্ন স্টেটমেন্ট প্রয়োজনীয়, এবং কোনও whileঅ্যাক্সেসযোগ্য ব্রেক স্টেটমেন্ট বা ধ্রুবক trueঅভিব্যক্তি ছাড়াই যে কোনও লুপ সাধারণভাবে সম্পূর্ণ করতে সক্ষম হিসাবে বিবেচিত হবে।

এই বিধিগুলির অর্থ হ'ল whileস্থির সত্যিকারের মত প্রকাশের সাথে এবং একটি ছাড়া আপনার বক্তব্যটিকে কখনই সাধারণত সম্পূর্ণরূপে বিবেচনা করাbreak হয় না এবং সুতরাং এর নীচে কোনও কোড কখনওই পৌঁছনীয় বলে বিবেচিত হয় না । পদ্ধতির শেষটি লুপের নীচে, এবং যেহেতু লুপের নীচে সমস্ত কিছু অ্যাক্সেসযোগ্য হয়, তেমনি পদ্ধতির সমাপ্তি হয়, এবং এভাবে পদ্ধতিটি সম্ভবত সাধারণত সম্পূর্ণরূপে সম্পন্ন করতে পারে না (যা কম্পাইলার সন্ধান করে এটি)।

if অন্যদিকে বিবৃতিগুলিতে লুপকে সাশ্রয়ী ধ্রুবক অভিব্যক্তি সম্পর্কিত বিশেষ ছাড় নেই tion

তুলনা করা:

// I have a compiler error!
public boolean testReturn()
{
    final boolean condition = true;

    if (condition) return true;
}

সঙ্গে:

// I compile just fine!
public boolean testReturn()
{
    final boolean condition = true;

    while (condition)
    {
        return true;
    }
}

পার্থক্যের কারণটি বেশ আকর্ষণীয় এবং এটি শর্তাধীন সংকলন পতাকাগুলির জন্য অনুমতি দেওয়ার আকাঙ্ক্ষার কারণে যা সংকলক ত্রুটিগুলি তৈরি করে না (জেএলএস থেকে):

কেউ যদি এই বিবৃতিটি নিম্নলিখিত পদ্ধতিতে পরিচালনা করবেন বলে আশা করতে পারে:

  • নীচে অন্তত একটি সত্য যদি if-then বিবৃতিটি সাধারণত সম্পূর্ণ করতে পারে:

    • যদি-তবে বিবৃতিটি পৌঁছনীয় হয় এবং শর্তটি প্রকাশটি একটি ধ্রুবক প্রকাশ নয় যার মান সত্য।

    • তত্ক্ষণিক বিবৃতি স্বাভাবিকভাবে সম্পূর্ণ করতে পারে।

    তদ্বির-বিবৃতিটি যদি পৌঁছনো হয় তবে যদি বিবৃতিটি পৌঁছনীয় হয় এবং শর্তটি প্রকাশটি একটি ধ্রুবক প্রকাশ নয় যার মানটি মিথ্যা।

  • যদি-তারপর-অন্য বিবৃতিটি স্বাভাবিকভাবে সম্পূর্ণ করতে পারে যদি তফতুর-বিবৃতিটি স্বাভাবিকভাবে সম্পূর্ণ করতে পারে বা অন্য-বিবৃতিটি সাধারণত সম্পূর্ণ করতে পারে।

    • যদি-তবে-অন্য বিবৃতিটি পৌঁছনীয় হয় তবে তারপরে বিবৃতিটি পৌঁছনীয় এবং শর্তটি প্রকাশটি একটি ধ্রুবক প্রকাশ নয় যার মানটি মিথ্যা।

    • অন্য-বিবৃতিটি যদি পৌঁছনো হয় তবে যদি-তবে-অন্য বিবৃতিটি পৌঁছনীয় হয় এবং শর্তটি প্রকাশ কোনও ধ্রুবক প্রকাশ নয় যার মান সত্য।

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

উদাহরণস্বরূপ, নিম্নলিখিত বিবৃতিটি একটি সংকলন-সময় ত্রুটির ফলাফল করে:

while (false) { x=3; }কারণ বিবৃতিটি x=3;পৌঁছনীয় নয়; কিন্তু অতিমাত্রায় অনুরূপ ক্ষেত্রে:

if (false) { x=3; }একটি সংকলন-সময় ত্রুটির ফলে না। একটি অনুকূলকরণ সংকলক বুঝতে পারে যে বিবৃতিটি x=3;কখনই কার্যকর হবে না এবং উত্পন্ন শ্রেণিবদ্ধ ফাইল থেকে এই বিবৃতিটির কোড বাদ দিতে পারে, তবে x=3;এখানে বর্ণিত প্রযুক্তিগত অর্থে বিবৃতিটিকে "অ্যাক্সেসযোগ্য" হিসাবে বিবেচনা করা হয় না।

এই পৃথক পৃথক চিকিত্সার যুক্তি হ'ল প্রোগ্রামারদের "পতাকা চলক" সংজ্ঞায়িত করার অনুমতি দেওয়া যেমন:

static final boolean DEBUG = false; এবং তারপরে কোড লিখুন যেমন:

if (DEBUG) { x=3; } ধারণাটি হ'ল ডিইবিইউগির মানটি মিথ্যা থেকে সত্যে বা সত্য থেকে মিথ্যাতে পরিবর্তন করা এবং প্রোগ্রামের পাঠ্যে অন্য কোনও পরিবর্তন ছাড়াই কোডটি সঠিকভাবে সংকলন করা উচিত।

শর্তসাপেক্ষ বিরতির বিবৃতি সংকলক ত্রুটির ফলে কেন ঘটে?

লুপের পুনঃব্যবহারযোগ্যতা বিধিগুলিতে উদ্ধৃত হিসাবে কিছুক্ষণের মধ্যে লুপটি সম্পূর্ণরূপে সম্পূর্ণ করতে পারে যদি এটিতে একটি অ্যাক্সেসযোগ্য ব্রেক স্টেটমেন্ট থাকে। যেহেতু ifবিবৃতিটির তত্কালীন ধারাটির পুনঃব্যবহারযোগ্যতার জন্য বিধিগুলি শর্তটিকে মোটেও ifবিবেচনা করে না, এই জাতীয় শর্তাধীন ifবিবৃতিটির তত্কালীন ধারাটি সর্বদা পৌঁছনীয় বলে বিবেচিত হয়।

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

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