Java Catch Multiple Exceptions

Java Catch Multiple Exceptions: कई बार ऐसी परिस्थितियां होती हैं कि एक ही try Block से एक से ज्यादा प्रकार के Exceptions Generate हो सकते हैं। इस प्रकार की स्थितियों को Solve करने के लिए हम एक से ज्यादा catch Block को Use कर सकते हैं, जहां हर catch Block एक अलग प्रकार के Exception को Handle करने का काम करता है।

जब try Block कोई Exception Object Throw करता है, तब विभिन्न catch Blocks में Throw किए गए Object के Type को Check किया जाता है। जिस catch Block का Type Throw किए गए Object के समान होता है, वह catch Block Execute हो जाता है और अन्‍य catch Blocks Bypass हो जाते हैं। इस प्रक्रिया को हम निम्नानुसार उदाहरण द्वारा समझ सकते हैं:

// Program
	class MultipleCatchBlock
	{
		public static void main(String args[])
		{
			try
			{
			int number = args.length;
	
			System.out.println("Command Line Arguments = " + number);
			
			int x = 122/number;
			int y[] = {1};
			y[10] = 99;
			}
			catch(ArithmeticException ae)
			{
				System.out.println("Arithmetical Exception : Divide by zero");
			}
			catch(ArrayIndexOutOfBoundsException ae)
			{
				System.out.println("Array Bound Exception :" + ae);
			}
			System.out.println("After try / catch Blocks.");
		}
	}

Output: For ArithmeticException Catch Block
   Command Line Arguments = 0
   Arithmetical Exception : Divide by zero
	After try / catch Blocks.

Output: For ArrayIndexOutOfBoundsException Catch Block
   Command Line Arguments = 1
   Array Bound Exception :java.lang.ArrayIndexOutOfBoundsException
	After try / catch Blocks.

इस Program में यदि कोई Command Line Parameter प्रदान नहीं किया जाएगा, तो इसमें Division By Zero की Error Generate होगी। चूंकि ये एक Arithmetical Type Exception है, इसलिए इस Exception को Program का पहला catch Block Catch करेगा। जबकि यदि User Command Prompt पर एक भी Argument Pass करता है, तो Division By Zero की Exception Generate नहीं होती है, बल्कि ArrayIndexOutOfBoundsException Generate होती है। चूंकि Array की Size तो 1 है और हम Index Number 10 पर मान 99 को Store करना चाहते हैं, जो कि सम्भव नहीं है। इसलिए Array के Bound से सम्बंधित Exception Generate होता है, जो Program के दूसरे catch Block द्वारा Handle होता है।

जब हम Multiple Catch Block Statement Use करते हैं, तब हमें इस बात का ध्‍यान रखना होता है कि Exception Sub Class के Exception को Handle करने का catch Block किसी भी अन्‍य Super Class Block से पहले Define होना जरूरी होता है। हमें ऐसा इसलिए करना जरूरी होता है क्योंकि एक ऐसा catch Block जो एक Super Class को Use करता है, वह Super Class के Exceptions को तो Catch करेगा, साथ ही वह Sub Class के भी सभी Exceptions को Catch कर लेगा, क्योंकि हर Sub Class “Kind Of” Super Class होता है और कोई Super Class Reference Object किसी भी Sub Class के Object को Refer कर सकता है।

इसलिए यदि हम किसी Super Class के catch Block को उसके किसी भी Sub Class के catch Block से पहले Define कर देंगे, तो Throw किया गया Sub Class Object कभी भी उसके Sub Class catch Block तक नहीं पहुंच पाएगा। इसलिए जब भी हमें Multiple catch Block को Use करना होता है, हमें हमेंशा सबसे पहले Sub Classes के catch Block को Define करना होता है और सबसे अन्त में उनकी Super Class के catch Block को Define करना होता है। इस Process को निम्नानुसार एक Program द्वारा समझाया गया है:

// Program
	class MultipleCatchBlockHiearchy{
		public static void main(String args[])	{
	
			try{
				int x = 0;
				int y = 12/x;
			}
			catch(Exception ae){
				System.out.println("Generic Exception catch block.");
			}
	
			catch(ArithmeticException ae){
				System.out.println("This statement never reached");
			}
		}
	}

// Output 
   D:\Java\MultipleCatchBlockHiearchy.java:17: exception 
   java.lang.ArithmeticException has already been caught
                catch(ArithmeticException ae)
                ^
	1 error

यदि हम इस Program को Compile करने की कोशिश करते हैं, तो हमें एक Error Message प्राप्त होता है, जो ये बताता है कि जिस Exception को catch करने के लिए इस catch Block को लिखा गया है, वह Exception Object इस catch Block तक आने से पहले ही Catch हो रहा है। क्योंकि ArithmeticException Class Exception Class की Sub Class है और हमने Exception Class से सम्बंधित सभी Exceptions को Handle करने के लिए पहले ही catch Block Define कर दिया है।

चूंकि हम जानते हैं कि सभी प्रकार के Exception Objects “Kind Of” Exceptions ही हैं। यानी जितने भी Exception Object Generate होते हैं, उन्हें Super Class Exception द्वारा Catch किया जा सकता है, इसलिए ArithmeticException जो कि Exception Class की Sub Class है, इस Exception को Handle करने वाले catch Block तक जावा कभी भी नहीं पहुंच पा,गा।

इस Exception को handle करने के लिए जरूरी है कि हम पहले विभिन्न Sub Classes के Exceptions को Reverse Hierarchy के रूप में Define करें और सबसे अन्त में Super Class Exception के catch Block को Define करें। यानी हमें इसी Program को निम्नानुसार Define करना होगा:

// Program
	class MultipleCatchBlockHiearchy
	{
		public static void main(String args[])
		{
	
			try
			{
				int x = 0;
				int y = 12/x;
			}
	
			catch(ArithmeticException ae)
			{
				System.out.println("Now this statement is reachable.");
			}
	
			catch(Exception ae)
			{
				System.out.println("Generic Exception catch block.");
			}
		}
	}

// Output 
	Now this statement is reachable.

कई बार ऐसी स्थितियां होती हैं, कि catch Block को Define किए बिना हम Program को Normal Flow में Run नहीं कर सकते हैं और catch Block में हमें कुछ Extra Ordinary काम करना नहीं होता है। इस स्थिति में catch Block को Define तो किया जाता है, लेकिन उस Block में कोई Statement नहीं लिखा जाताए बल्कि Definition Block को Empty छोड दिया जाता है। जब हमें किसी Exception को Handle नहीं करना होता है, तब हम निम्नानुसार किसी Exception को Skip कर सकते हैं:

// Program
	class NothingToDoInCatch
	{
		public static void main(String args[])
		{
	
			try
			{
				int x = 0;
				int y = 12/x;
			}
	
			catch(ArithmeticException ae)
			{
				System.out.println("Hello");
			}
			System.out.println("Nothing done in catch block.");
		}
	}

// Output 
   Hello
   Nothing done in catch block.

Nested try Statement

हम try Statement Block को भी Nested कर सकते हैं। हम जैसे ही एक try Block से दूसरे try Block में प्रवेश करते हैं, पिछले try Block की सभी Information Stack में Store हो जाती हैं। यदि एक Inner try Block का catch Block ना हो, तो try Block Outer try के catch Block को Exception Throw करता है। यदि कोई भी Outer catch Block Inner try Block के Exception को Handle नहीं कर पाता है, तो जावा Run Time Environment उस Inner Exception Block के Exception को Handle कर लेता है।

Java Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

Java Programming Language in Hindi | Page: 682 | Format: PDF

BUY NOW GET DEMO REVIEWS