স্ট্যাকওভারফ্লো এরিয়ার থেকে কেন পুনরুদ্ধার করা সম্ভব?


100

আমি StackOverflowErrorজাভাতে ঘটনার পরেও কীভাবে কার্যকর করা চালিয়ে যাওয়া সম্ভব তা নিয়ে আমি অবাক হয়েছি ।

আমি জানি StackOverflowErrorএটি ক্লাস ত্রুটির একটি সাবগ্লাস। ক্লাস ত্রুটিটিকে "থ্রোয়েবলের একটি উপশ্রেণী হিসাবে চিহ্নিত করা হয় যা মারাত্মক সমস্যাগুলি নির্দেশ করে যে যুক্তিসঙ্গত প্রয়োগটি ধরার চেষ্টা করা উচিত নয়।"

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

public class Test
{
    public static void main(String[] args)
    {
        try {
            foo();
        } catch (StackOverflowError e) {
            bar();
        }
        System.out.println("normal termination");
    }

    private static void foo() {
        System.out.println("foo");
        foo();
    }

    private static void bar() {
        System.out.println("bar");
    }
}

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



57
আমি স্ট্যাকওভারফ্লোতে সব সময় ত্রুটি করি। যদিও আমাকে ফিরে আসতে বাধা দেয় না।

10
ইয়ো দা ... আমি শুনেছি আপনি স্ট্যাক ওভারফ্লো পছন্দ করেছেন তাই আমরা আপনার স্ট্যাকওভারফ্লো.কম এ স্ট্যাকের ওভারফ্লো রেখেছি!
পিয়েরে হেনরি 9

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

উত্তর:


119

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

  • বর্তমানে সক্রিয় ফাংশন কার্যকর করা বাতিল
  • এর স্ট্যাক ফ্রেমটি মুছুন, কলিং ফাংশনটির সাথে এগিয়ে যান
  • কলারের মৃত্যুদণ্ড বাতিল করুন
  • এর স্ট্যাক ফ্রেমটি মুছুন, কলিং ফাংশনটির সাথে এগিয়ে যান
  • এবং তাই ...

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


1
@fge সম্পাদনা করতে নির্দ্বিধায়, আমি একটি অনুচ্ছেদে বিরতি বিবেচনা করেছি তবে এটি ভাল লাগছিল এমন কোনও জায়গা খুঁজে পাই না।

1
); আপনি বুলেট পয়েন্ট ব্যবহার করতে পারে ... আমি সম্পাদনা অন্যান্য ব্যক্তিদের পদে অনিচ্ছুক am
fge

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

2
@ ডেলানান, আমি মনে করি যে এটি কেন খারাপ ধারণা তা বিশদে না গিয়ে উত্তরটি অসম্পূর্ণ। একটি স্পষ্টভাবে নিক্ষেপ করা ব্যতিক্রমের পার্থক্যটি হ'ল Errorব্যতিক্রম নিরাপদ কোড লেখার পরেও প্রত্যাশা করা যায় না।
সাইমন রিখটার

1
@ সিমনরিখটার নং, প্রশ্নটি বেশ নির্দিষ্ট। এটি এস পরিচালনার বিষয়ে নয়Error । ওপি জিজ্ঞাসা করা হয় শুধুমাত্র সম্পর্কে StackOverflowError, এবং তা হ্যান্ডলিং একটি নির্দিষ্ট জিনিস জিজ্ঞেস করছেন এই ত্রুটি: কিভাবে একটি পদ্ধতি কল করতে পারেন না যখন এই ত্রুটি ধরা ব্যর্থ হয়।
বাকুরিউ

23

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


12

যখন স্ট্যাকওভারফ্লো ঘটে তখন জেভিএম স্ট্যাকটি মুক্ত করে ক্যাচে যাবে pop

উদাহরণস্বরূপ, এটি স্ট্যাকড সমস্ত ফু থেকে রাইড পেয়ে যায়।


8

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


1
আপনার ব্যতিক্রম হ্যান্ডলারটি যেটি উপলভ্য তার চেয়ে বেশি স্ট্যাকের জায়গার প্রয়োজন হবে না তা করার জন্য কেবল সাবধান হন!
ভিনস

2

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

যাইহোক, যে বলে যে এটি সাধারণভাবে হয়, যতটা সম্ভব বেশ একই নয় পুনরুদ্ধার A থেকে StackOverflowError

একটি StackOverflowErrorআইএস-এ VirtualMachineError, যা আইএস-এএন Error। আপনি উল্লেখ হিসাবে, জাভা একটি জন্য কিছু অস্পষ্ট পরামর্শ প্রদান Error:

গুরুতর সমস্যাগুলি নির্দেশ করে যে যুক্তিসঙ্গত প্রয়োগটি ধরার চেষ্টা করা উচিত নয়

এবং আপনি যুক্তিসঙ্গতভাবে, এই উপসংহারে যে উচিত একটি সংক্রামক মত শোনায় Errorকিছু পরিস্থিতিতে ঠিক আছে হতে পারে। নোট করুন যে একটি পরীক্ষা সম্পাদন করলে বোঝা যায় না যে সাধারণভাবে কিছু করা নিরাপদ। কেবল জাভা ভাষার নিয়ম এবং আপনার ব্যবহৃত ক্লাসগুলির স্পেসিফিকেশনগুলি এটি করতে পারে। এ VirtualMachineErrorব্যতিক্রমের একটি বিশেষ শ্রেণি, কারণ জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন এবং জাভা ভার্চুয়াল মেশিন স্পেসিফিকেশন এই ব্যতিক্রমটির শব্দার্থ সম্পর্কে তথ্য সরবরাহ করে। বিশেষত, দ্বিতীয়টি বলেছেন :

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

...

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

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

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

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