জেভিএম কীভাবে মূল পদ্ধতিতে নিক্ষিপ্ত একটি ব্যতিক্রম পরিচালনা করে?


10

আমি ব্যতিক্রমগুলি বুঝতে পারি, তাদের নিক্ষেপ করে, পরিচালনা করে এবং কল স্ট্যাকের (যেমন throws) নীচের পদ্ধতিতে তাদের প্রচার করি ।

আমি যা বুঝতে পারি না তা হ'ল:

public static void main(String[] args) throws Exception {
    ...
}

এখন, আমি ধরে নিলাম যে ক্ষেত্রে যেটি mainছুড়ে Exceptionফেলেছে, জেভিএম এটি পরিচালনা করে (সঠিক?) যদি এটি হয় তবে আমার প্রশ্নটি হ'ল:

JVM কীভাবে ব্যতিক্রমগুলি হ্যান্ডেল করে main? এটার কাজ কি?

উত্তর:


19

আপনি ভাবতে পারেন যে public static void mainজাভাতে পদ্ধতি বা mainসি এর ফাংশনটি আপনার প্রোগ্রামের আসল প্রবেশ বিন্দু - তবে তা নয়। সমস্ত উচ্চ-স্তরের ভাষাগুলিতে (সি সহ) একটি ভাষা রানটাইম থাকে যা প্রোগ্রাম শুরু করে এবং তারপরে নিয়ন্ত্রণ প্রবাহকে এন্ট্রি পয়েন্টে স্থানান্তর করে। জাভার ক্ষেত্রে আদিতে অন্তর্ভুক্ত থাকবে:

  • জেভিএম স্থাপন করছে
  • প্রয়োজনীয় ক্লাস লোড হচ্ছে
  • স্ট্যাটিক ইনিশিয়ালাইজার ব্লক চলছে। এটি mainচাওয়ার আগে ব্যবহারকারী-সংজ্ঞায়িত কোড কার্যকর করতে পারে । এই ব্লকগুলি ব্যতিক্রম ছোঁড়ার কথা নয়।

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

উদাহরণস্বরূপ উদ্দেশ্যে, আপনি দেখতে দেখতে দানবীয় ট্রাই-ক্যাচে সমস্ত কোড মোড়ানো রানটাইমটিকে চিত্রিত করতে পারেন

try {
    loadClasses();
    runInitializers();
    main(argv);
    System.exit(0);
} catch (Throwable e) {
    e.printStackTrace();
    System.exit(-1);
}

এ ছাড়া যে কোনও ভাষার পক্ষে আসলে এই জাতীয় কোড চালানো দরকার হয় না। throw(বা সমমানের) কোডে একই শব্দার্থক প্রয়োগ করা যেতে পারে যা প্রথম প্রযোজ্য ব্যতিক্রম হ্যান্ডলারের সন্ধান করে।


9

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

  • জেভিএম নিজেকে স্পিন করে এবং কার্যকর করার পরিবেশ প্রস্তুত করে।
  • জেভিএম একটি থ্রেড তৈরি main()করে যা কমান্ড-লাইন প্যারামিটারগুলি প্রযোজ্য তা প্রয়োগ করে পদ্ধতিটি পরিচালনা করবে ।
  • JVM একটি ডিফল্ট অচল ব্যতিক্রম হ্যান্ডলার সেট করে যা স্ট্যান্ডার্ড ত্রুটির ব্যতিক্রমটি মুদ্রণ করে এবং সমাপ্ত করে।
  • জেভিএম থ্রেডটি কার্যকর করে।

অপ্রকাশিত ব্যতিক্রমের ক্ষেত্রে, প্রোগ্রামটি উপরের তৃতীয় আইটেমটির জন্য কার্যকরভাবে মারা যায়। এই আচরণটি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে বিভাগ 11.3-এ আরও নির্দিষ্ট করা আছে


অতিরিক্ত তথ্য

অন্যরা স্থিতিশীল ব্লক এবং তারা কীভাবে পূর্বে সম্পাদন করে তা উল্লেখ করেছে main()। তবে সঠিকভাবে বুঝতে এটির জন্য আরও কিছুটা ব্যাখ্যা প্রয়োজন।

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

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

আর একটি এফওয়াইআই: স্ট্যাটিক ব্লক নিক্ষেপ করতে পারেErrorsযেমন হয় তেমনি নিক্ষেপ করা হয় Exceptionsনিষিদ্ধ (সংকলন-সময় ত্রুটি)। এক্সেপশনআইনিটায়ালাইজারেRuntimeExceptions মুড়ে ফেলা হয় । এই uncaught ব্যতিক্রম হ্যান্ডলার, যদি না আপনি সাবধানে বর্গ রেফারেন্স (এবং লোড হচ্ছে) একটি মোড়ানো যা সাধারণত হয় থ্রেড বা অ্যাপ্লিকেশন (মূল থ্রেড) হত্যা করবে প্রতি পরিচালনা করা হয় - ।trycatch

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