কোনও ফাংশন কল করার সময় কেন "ব্যতিক্রম নিক্ষেপ" প্রয়োজনীয়?


102
class throwseg1
{
    void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

    void show2() throws Exception  // Why throws is necessary here ?
    {
        show();
    }

    void show3() throws Exception  // Why throws is necessary here ?
    {
        show2();
    }

    public static void main(String s[]) throws Exception  // Why throws is necessary here ?
    {
        throwseg1 o1 = new throwseg1();
        o1.show3();
    }
}

কেন কম্পাইলার যে রিপোর্ট পদ্ধতি show2(), show3()এবং main()আছে

অপরিবর্তিত ব্যতিক্রম ব্যতিক্রম যা অবশ্যই ধরা পড়বে বা ছুঁড়ে ফেলার ঘোষণা করা হবে

আমি কখন throws Exceptionএই পদ্ধতিগুলি থেকে সরিয়ে দেব ?


4
@ পোলটম্বলিন প্রধান অবশ্যই ব্যতিক্রম ছুঁড়ে ঘোষণা করা যেতে পারে। যদি এটি হয় তবে জেভিএম বন্ধ হয়ে যাবে। এটি এটিকে উপেক্ষা করার কাছাকাছি যতই সংকলক অনুমতি দেবে।
তাইমন

যখন নামক পদ্ধতিটি ( মেথডোড 1 ) ছুড়ে দেয় Exceptionতখন আমাদের কলিং পদ্ধতি ( মেথড 2 ) এর সাথে সংজ্ঞা দিতে হয় throws Exception; যদি আমরা কলিং পদ্ধতিতে সেই ব্যতিক্রম হস্তান্তর না করি। এর উদ্দেশ্য কলিং পদ্ধতি (থেকে মাথা দিতে হয় Method3 এর) Method2 যে একটি ব্যতিক্রম দ্বারা নিক্ষিপ্ত হতে পারে Method2 এবং আপনি এটি এখানে হ্যান্ডেল করা উচিত, অন্যথায় এটা আপনার প্রোগ্রাম সাময়িক বিরতি করতে পারেন।
রিতো

একইভাবে, যদি মেথড 3 তার শরীরে ব্যতিক্রমটি পরিচালনা না করে তবে throws Exceptionতার কলিং পদ্ধতিটি মাথা ছাড়ানোর জন্য এটিটিকে তার পদ্ধতির সংজ্ঞায়িত করতে হয়েছিল। পূর্ববর্তী মন্তব্যের এক্সটেনশন
রিটো

উত্তর:


148

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

এখানে চিত্র বর্ণনা লিখুন

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


জাভা টিউটোরিয়াল থেকে :

একটি ব্যতিক্রম একটি অনুষ্ঠান, যা কোনও প্রোগ্রামের সম্পাদনার সময় ঘটে, যা প্রোগ্রামের নির্দেশাবলীর স্বাভাবিক প্রবাহকে ব্যাহত করে।

এখন, আপনি জানেন যে ব্যতিক্রমগুলি দুটি হিসাবে শ্রেণিবদ্ধ করা হয়েছে: চেক করা এবং চেক করা নেই। কেন এই শ্রেণিবিন্যাস?

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

চেক না করা ব্যতিক্রম: এগুলিকে আবার দুটি ভাগে ভাগ করা যায়: ত্রুটি এবং রানটাইম এক্সেপশন। তাদের চেক না করার একটি কারণ হ'ল তারা সংখ্যায় অসংখ্য, এবং তাদের সবগুলি পরিচালনা করার জন্য আমাদের প্রোগ্রামটি বিশৃঙ্খলা করবে এবং এর স্পষ্টতা হ্রাস করবে। অন্য কারণ:

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

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

বিস্তারিত তথ্যের জন্য দেখুন:


আপনার জবাব থেকে আমি যা পেয়েছি তা হ'ল ত্রুটি শ্রেণি এবং তার সাবলাক্লাস এবং রানটাইমএক্সেপশন ক্লাস এবং এর সাব ক্লাসগুলি, তারা চেক না করা ব্যতিক্রম (যেমন সিস্টেম.আউট.প্রিন্টলন (5/0) এর অধীনে আসে; এটি ফেলে দেওয়ার দরকার নেই কারণ এটি একটি রানটাইম ব্যতিক্রম তবে তবুও আমরা
ট্র্যাচ

আরও একটি প্রশ্ন: ব্যতিক্রমগুলি যদি চেক না করা এবং চেক করে শ্রেণীবদ্ধ করা হয়, বিশেষত চেক করা না হওয়া (রানটাইম ত্রুটি) সংকলনের সময় বেশি সংখ্যক ত্রুটি এড়াতে?
এনআর 5

@ জোমস - বলুন যে কোনও পদ্ধতির কোড কোডটি আইওএক্সেপশন ছুড়ে দেয়। তারপরে, পদ্ধতির ঘোষণায় "থ্রো ব্যতিক্রম" রাখা কি ঠিক হবে?
মাস্টারজয়

উহু. আমি এটাকে এখন পেলাম. ব্যতিক্রম শ্রেণিবদ্ধের নিয়মের ব্যতিক্রম আছে। তোলে। পারফেক্ট ইন্দ্রিয়. ধন্যবাদ জাভা
জেজেএস

25

জাভা আপনাকে হ্যান্ডেল বা সমস্ত ব্যতিক্রম ঘোষণা করার প্রয়োজন। আপনি যদি চেষ্টা / ক্যাচ ব্লক ব্যবহার করে কোনও ব্যতিক্রম পরিচালনা করছেন না তবে তা অবশ্যই পদ্ধতির স্বাক্ষরে ঘোষণা করতে হবে।

উদাহরণ স্বরূপ:

class throwseg1 {
    void show() throws Exception {
        throw new Exception();
    }
}

এই হিসাবে লেখা উচিত:

class throwseg1 {
    void show() {
        try {
            throw new Exception();
        } catch(Exception e) {
            // code to handle the exception
        }
    }
}

এই পদ্ধতিটির ঘোষণায় আপনি "থ্রো ব্যতিক্রম" ঘোষণা থেকে মুক্তি পেতে পারেন।


7
সমস্ত ব্যতিক্রম যা সাবক্লাস নয় RuntimeException, এটি।
ysavit

ব্যতিক্রমের মতো অন্য কোনও ক্লাস থাকলে তা চেক করা হয়?
এনআর 5

4
আপনি কি বোঝাতে চেয়েছেন? যেহেতু সমস্ত ব্যতিক্রম বস্তুগুলির তাদের বেস শ্রেণি হিসাবে "ব্যতিক্রম" রয়েছে, আপনি যদি "ব্যতিক্রম" অবজেক্টটি ধরেন (আমার উদাহরণের মতো) এটি ছুঁড়ে দেওয়া যে কোনও ব্যতিক্রম ধরা ফেলবে। আরও সুনির্দিষ্ট হওয়ার জন্য (যেহেতু বিভিন্ন ব্যতিক্রম সম্ভবত জিনিসগুলি পরিচালনা করার বিভিন্ন পদ্ধতির প্রয়োজন হবে) আপনার একাধিক ক্যাচ ব্লক থাকা উচিত।
jebar8

যদি আমি বলি যে পরীক্ষিত ব্যতিক্রমগুলি @ সংকলন সময় পরিচালনা করতে হবে এবং রানটাইমে ধরা পড়বে। আমি কি সঠিক ? যদি হ্যাঁ তবে চেক না করা ব্যতিক্রমের জন্য একই বাক্যটি বাক্য বানানো হবে?
এনআর 5

@ jebar8 - আপনি জাভা কে .NET - এর সাথে বিভ্রান্ত করছেন, জাভাতে, নিক্ষিপ্ত ব্যক্তিদের উত্তরাধিকারী হতে হবে Throwable(উত্তরাধিকারসূত্রেও Exceptionকাজ করে, কারণ এটি প্রসারিত হয় Throwable, তবে এটির প্রয়োজন নেই)।
BrainSlugs83

5

throws Exceptionঘোষণা পদ্ধতি অপেক্ষিত কিন্তু অনিবার্য কারণে একটি ব্যতিক্রম ফেলে দিতে পারে সম্পর্কে অবগত থাকার একটি স্বয়ংক্রিয় উপায়। ঘোষণা সাধারণত টাইপ বা ব্যতিক্রম যে যেমন নিক্ষিপ্ত করা যেতে পারে সে বিষয়ে সুনির্দিষ্ট throws IOExceptionবা throws IOException, MyException

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

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

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

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

এই ধরণের সমাধান সম্পর্কে দুর্দান্ত জিনিসটি হ'ল সংকলক যখন প্রতিবেদন Error: Unhandled exception type java.io.IOExceptionকরে তখন ব্যতিক্রমটি ছুঁড়ে ফেলার জন্য ঘোষিত পদ্ধতির ফাইল এবং লাইন নম্বর দেয়। তারপরে আপনি কেবল বুকটি পাস করতে এবং আপনার পদ্ধতিটিকে "আইওএক্সেপশন" নিক্ষেপ করতে পছন্দ করতে পারেন। এটি মূল পদ্ধতি পর্যন্ত সমস্ত উপায়ে করা যেতে পারে যেখানে এটির পরে প্রোগ্রামটি বন্ধ হয়ে যায় এবং ব্যবহারকারীর কাছে ব্যতিক্রমটি রিপোর্ট করে। যাইহোক, ব্যতিক্রমটি ধরা এবং এটির সাথে কীভাবে ঘটেছে এবং কীভাবে এটি ঠিক করা যায় তা ব্যবহারকারীকে ব্যাখ্যা করার মতো একটি সুন্দর উপায়ে এটি মোকাবেলা করা ভাল। যখন কোনও পদ্ধতি ব্যতিক্রমটিকে ধরে ফেলে এবং পরিচালনা করে, তখন তার ব্যতিক্রমটি আর ঘোষণা করতে হয় না। বাক কথা বলতে বলতে সেখানে থামে।


4

Exceptionএকটি পরীক্ষিত ব্যতিক্রম শ্রেণি। অতএব, যে কোনও কোড যা এমন পদ্ধতিতে কল করে যে এটি ঘোষণা করে যে এটি throws Exceptionঅবশ্যই এটি পরিচালনা করবে বা ঘোষণা করবে।


শৃঙ্খলে থাকা প্রতিটি পদ্ধতিই মূল সহ ব্যাতিক্রম বাদ দেওয়ার ঘোষণা দেয়। তাহলে সমস্যা কোথায়?
পল টমলিন

@ পলটমব্লিন ইম জিজ্ঞাসা করছেন যে কলিং ফাংশনগুলিতে ব্যতিক্রম নিক্ষেপ কেন লিখতে হবে, একটি ফাংশন যা একটি ব্যতিক্রম ছুঁড়ে ডাকে
এনআর 5

ঠিক আছে, আমি বুঝতে পারি নি যে আপনি কেন একটি সংকলক ত্রুটি সম্পর্কে জিজ্ঞাসা করছেন যা আপনি পোস্ট করেছেন যে কোডটি আসলে আপনি পাচ্ছেন না। এটা জিজ্ঞাসা করার একটি বিজোড় উপায়।
পল টমলিন

0
package javaexception;


public class JavaException {
   void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

void show2() throws Exception  // Why throws is necessary here ?
{
    show();
}

void show3() throws Exception  // Why throws is necessary here ?
{
    show2();
}
public static void main(String[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

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


0
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

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

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

যেহেতু আপনি শো 2 () পদ্ধতিতে শো () পদ্ধতিটি ব্যবহার করছেন এবং আপনি এখানে ব্যতিক্রম হ'ল কমপক্ষে ব্যতিক্রম প্রচার করেছেন। আপনি যদি এখানে ব্যতিক্রম পরিচালনা করছেন না, তবে আপনি থ্রো কীওয়ার্ডটি ব্যবহার করছেন। সুতরাং যে পদ্ধতি স্বাক্ষর এ থ্রো কীওয়ার্ড ব্যবহার করার কারণ।


0

আপনি যদি বর্তমান পদ্ধতির স্বাক্ষরে নিক্ষেপকারী নির্দেশকে ঘোষণা করে ব্যতিক্রমটি প্রচার করেন তবে কোথাও লাইনটি কল করুন বা স্ট্যাকের চেষ্টা করুন / ক্যাচ কনস্ট্রাক্ট ব্যতিক্রমটি পরিচালনা করতে হবে।


এই মন্তব্যটি মন্তব্য বিভাগে যুক্ত করা উচিত কারণ এটি একটি যাচাইযোগ্য উত্তর বা একটি উদাহরণ সরবরাহ করে না। - স্ট্যাকওভারফ্লো.com
পল ডসন

-1

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

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