अपवाद प्रकार

"मैं आज एक और चीज़ के बारे में बात करना चाहता था। जावा में, सभी अपवादों को दो प्रकारों में विभाजित किया गया है: चेक किए गए और अनचेक किए गए (जिन्हें पकड़ा जाना चाहिए और जिन्हें आपको पकड़ना नहीं है)। डिफ़ॉल्ट रूप से, सभी अपवादों को होना चाहिए पकड़ा गया।"

"क्या आप जानबूझकर अपने कोड में अपवाद फेंक सकते हैं?"

"आप अपने कोड में कोई भी अपवाद फेंक सकते हैं। आप अपना अपवाद भी लिख सकते हैं। लेकिन हम उसके बारे में बाद में बात करेंगे। अभी, जावा मशीन द्वारा फेंके गए अपवादों पर ध्यान दें।"

"ठीक है।"

"यदि ClassNotFoundException या FileNotFoundException को एक विधि में फेंका (घटित) किया जाता है, तो डेवलपर को उन्हें विधि घोषणा में इंगित करना चाहिए। ये चेक किए गए अपवाद हैं। यह आमतौर पर ऐसा दिखता है:"

चेक किए गए अपवादों के उदाहरण
public static void method1() throws ClassNotFoundException, FileNotFoundException

public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

"तो हम सिर्फ 'फेंकता' लिखते हैं जिसके बाद अपवादों की अल्पविराम-सीमांकित सूची होती है, है ना?"

method1"हाँ। लेकिन और भी बहुत कुछ है। प्रोग्राम को संकलित करने के लिए, नीचे दिए गए उदाहरण में कॉल करने वाली विधि को दो चीजों में से एक करना चाहिए: या तो इन अपवादों को पकड़ें या उन्हें (कॉल करने वाले को) रीथ्रो करें , इसकी घोषणा में रिथ्रोन अपवादों का संकेत दें। "

"फिर से। यदि आपकी मुख्य विधि को एक ऐसी विधि को कॉल करने की आवश्यकता है जिसकी घोषणा में ' FileNotFoundException फेंकता है , ...' है, तो आपको दो चीजों में से एक करने की आवश्यकता है:

1) FileNotFoundException को पकड़ें , ...

आपको असुरक्षित विधि को कॉल करने वाले कोड को ट्राइ-कैच ब्लॉक में लपेटना होगा।

2) FileNotFoundException को न पकड़ें , ...

आपको इन अपवादों को अपनी मुख्य विधि की थ्रो सूची में जोड़ना होगा।"

"क्या आप मुझे एक उदाहरण दे सकते हैं?"

"इस पर एक नज़र डालें:"

चेक किए गए अपवादों के उदाहरण
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"इस उदाहरण में कोड संकलित नहीं होगा, क्योंकि मुख्य विधि विधि 1() को कॉल करती है , जो पकड़े जाने वाले अपवादों को फेंकती है।"

"इसे संकलित करने के लिए, हमें मुख्य विधि में अपवाद हैंडलिंग जोड़ने की आवश्यकता है। आप इसे दो तरीकों में से एक में कर सकते हैं:"

विकल्प 1: हम केवल अपवाद (कॉल करने वाले के लिए) को फिर से हटा देते हैं:
public static void main(String[] args)  throws FileNotFoundException, ClassNotFoundException 
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"और यहां हम इसे ट्राइ-कैच के साथ पकड़ते हैं :"

विकल्प 2: अपवाद को पकड़ें:
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"यह स्पष्ट होने लगा है।"

"निम्न उदाहरण देखें। यह आपको बाकी को समझने में मदद करेगा।"

अपवादों को संभालने के बजाय, हम उन्हें कॉल स्टैक से नीचे के तरीकों पर फिर से फेंक देते हैं जो जानते हैं कि उन्हें कैसे संभालना है:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
एक अपवाद को संभालें और दूसरे को फेंक दें:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
दोनों अपवादों को पकड़ें, कोई भी अपवाद न फेंकें:
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("ClassNotFoundException has been caught.");
    }
}

"एक और प्रकार का अपवाद है, रनटाइम अपवाद और कक्षाएं जो इसे प्राप्त करती हैं। आपको उन्हें पकड़ने की आवश्यकता नहीं है। ये अनियंत्रित अपवाद हैं। उन्हें भविष्यवाणी करना मुश्किल माना जाता है। आप उनसे उसी तरह निपट सकते हैं, लेकिन आप उन्हें थ्रो क्लॉज में इंगित करने की आवश्यकता नहीं है ।"