Exception Handling in Java in Hindi – Java में Exception handling क्या है?

Last Updated on March 7, 2023 by RAJENDRAPRASAD

Exception Handling in Java in Hindi – Hello दोस्तों rajhindime.in में आपका स्वागत है |

दोस्तों, पिछले post Object Type Casting in Java in Hindi में आपने Object Type Casting क्या है, उसके कितने types हैं ? उसे कैसे और कब use करते हैं, Interface और Object Type Casting  इत्यादि के बारे में जाना |

आज के इस post में आप Exception Handling के बारे में विस्तार से जानेंगे |

Exception handling Java के अंदर बहुत ही important concept है |

अगर आप चाहते हैं कि आपका program बिना किसी interruption अथवा रुकावट के, normal flow में run हो तो, आपको Exception Handling आना ही चाहिए |

आइए Exception को एक real time example के द्वारा समझे |

हम सभी का अपना-अपना एक daily normal schedule होता है |

मान लो, आपको daily सुबह 7 बजे school पहुँचना होता है |

उसके लिए आप सबसे पहले सुबह 6 बजे उठते हो, फिर तैयार होकर आप 6.30 am school के लिए निकलते हो और 7 बजे school पहुँच जाते हो, यह same routine (दिनचर्या) आपका हर रोज चलता है |

एक दिन आप जैसे ही 6.30 am को घर से school के लिए निकलते हो और आधे रास्ते में पहुँचने पर आपको पता चलता है कि, जिस रास्ते से आप जा रहे हो, आगे से रास्ता बंद है या फिर ढेर सारा traffic है | अब इस स्थिति में आप समय पर अर्थात 7 बजे तो school नहीं पहुँच पाओगे |

कहने का मतलब है, आपके daily schedule के बीच में Traffic या फिर रास्ताबंद  नाम का रुकावट आ गया जिसकी हमें कोई चाहत नहीं थी, और आप समय पर नहीं पहुँच पाए |

यह रुकावट और कुछ नहीं, programming language में इसे exception कहते हैं |

What is exception- exception क्या है ?

कोई भी अनचाही घटना (unwanted/unexpected event ) जो program के normal execution flow को बाधित (interrupt/disturb) करती है, उसे exception कहते हैं |

Exception handling की जरुरत :

आइए पिछले example में फिर से चलते हैं |

आप school देर से पहुँचे | अब यहाँ पर संभावना (possibility) यह हो सकती है कि आपको school में entry ही न मिले | अगर entry मिल भी जाती है तब भी आपके पढाई (study) का कुछ न कुछ नुकसान जरूर होगा |

इसलिए जरुरी है कि future में ऐसा न हो, उसके लिए कुछ न कुछ तोड़ तो निकलना ही होगा | कहने का मतलब है, exception को handle करना ही होगा |

मान लीजिए वह रास्ता हमेशा के लिए बंद हो गया या फिर आपको रोज-रोज उसी जगह पर उसी समय पर ढेर सारा traffic मिलता है | अब आप क्या करेंगे ? आप कोई short-cut या फिर दूसरा रास्ता ढूढ़ के रखेंगे, जिससे traffic मिलने पर आप उस रास्ते से होकर समय पर school पहुँच जाए |

अगर आपके program में बार-बार exception आता है, जाहिर सी बात है आपका program properly execute नहीं होगा और वह abnormally terminate (बंद) हो जाएगा और यह भी हो सकता है कि आपका application ही crash हो जाए | ऐसा कुछ न हो इसलिए exception को handle करना जरुरी है |

यदि program के execution के दौरान कुछ भी wrong हो जाए, तो उस स्थिति में भी हमारा program सरलता से terminate हो, बिना कुछ नुकसान किए (graceful termination) | इसके लिए Exception handling आवश्यक है |

आइए अब जानते हैं कि Exception मिलने पर program internally कैसे behave करता है |

Default Exception Handler in Java:

इसे समझने से पहले आइए एक program देखते हैं |

Program1 :

public class DefaultExceptionHandlerDemo_withoutException {

	public static void main(String[] args) {
		m2();
	}

	static void m2() {
		m1();
	}

	static void m1() {
		System.out.println("Hello");
	}
}

OutPut:

Hello

Explanation:

ऊपर program 1 में, main() method ने internally method m2() को call किया है, जिसने internally method m1() को call किया है जिसमे System.out.println(“Hello”); लिखा है, इसलिए output “Hello” मिला |

Program 2:

public class DefaultExceptionHandlerDemo_withException {

	public static void main(String[] args) {
		m2();
	}

	static void m2() {
		m1();
	}

	static void m1() {
		System.out.println("Hello");			//line 12
		System.out.println(10 / 0);				//line 13
		System.out.println("How are you");		//line 14
	}
}

OutPut:

Hello
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m1(DefaultExceptionHandlerDemo_withException.java:13)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m2(DefaultExceptionHandlerDemo_withException.java:8)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.main(DefaultExceptionHandlerDemo_withException.java:4)

Explanation:

ऊपर program 2 में भी, main() method ने internally method m2() को call किया है, जिसने internally method m1() को call किया है जिसमे से line 12 execute हुआ और output “Hello” मिला|

उसके बाद line 13 पर ArithmeticException occur (उन्पन्न) हुआ, और program abnormally terminate हो गया जिसके कारण line 14 execute ही नहीं हुआ |

जब भी हम java में exception को explicitly/खुद से handle नहीं करते, उस स्थिति में,

Step 1 – जिस method में exception occur होता है,वह method JVM की सहायता से एक exception object create करता है जिसमे 3 information होती हैं |

a. Name b. Description c. Stack trace/location

Step 2 – इस create हुए object को वह JVM को दे देता है |

Step 3 – JVM सबसे पहले उस method को abnormally terminate कर देता है और उसके बाद वह internally Default Exception Handler को call करता है जिसका कार्य होता है,  console पर उस object के सारे information को print कर देना |

इस तरह ऊपर के output में तीनो information इस प्रकार हैं,

1. name ------- java.lang.ArithmeticException:
2. Description ------------- / by zero
3. Stack Trace/location ------- at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m1(DefaultExceptionHandlerDemo_withException.java:13)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m2(DefaultExceptionHandlerDemo_withException.java:8)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.main(DefaultExceptionHandlerDemo_withException.java:4)

Java में बहुत सारे exception हैं जैसे,

ClassNotFoundException, ArithmeticException, FileNotFoundException इत्यादि |

यह सारे के सारे exception java में class के रूप में declared होते हैं | वैसे भी java में सब कुछ एक class ही तो है |

जैसे Object class, java में available सभी classes का parent/root class है, ठीक उसी तरह “Throwable” class सभी exceptions का root/parent class है |

कहने का मतलब, java में जितने भी execption हैं सब के सब Throwable class के ही child class हैं |

आइए अब exception के hierarchy को समझे |

Hierarchy of Exception- exception की hierarchy:

जैसा कि ऊपर दिखाया गया है |

Throwable class के दो subclass हैं 1. Exception 2. Error

आइए अब जानते हैं कि Exception और error में क्या difference है |

Exception और Error में अंतर

Exception :

1. Exception हमेशा हमारे program की वजह से occur (उन्पन्न) होता है, अतः इसके लिए हमेशा programmer ही responsible होता है |

2. इसे recover किया जा सकता है | कहने का मतलब है, इसे programmer द्वारा आसानी से handle किया जा सकता है |

Error :

1. इसके लिए हमारा program/code कभी भी responsible नहीं होता, यह हमेशा resources की कमी (lack of resources) के कारण occur होता है, जैसे memory में कमी, virus attack इत्यादि |

2. यह recoverable नहीं होता |

जैसा कि hierarchy में दिखाया गया है |

Exception तथा Error के multiple sub classes हैं |

इन सभी classes और sub classes में कुछ checked हैं और कुछ unchecked |

आइए एक real time example के द्वारा समझे कि checked क्या होता है |

दोस्तों आप सभी लोगो ने 10th की board exam जरूर दी होगी या फिर future में देने वाले होंगे |

याद कीजिए जब भी हम तैयार होकर घर से निकलने ही वाले होते हैं, तब हमारे parent(माता-पिता) यह जरूर पूछते हैं कि hall-ticket लिया कि नहीं, extra pen लिया कि नहीं |

मान लो आपने यह सारी चीजे नहीं ली, तो क्या आपको उसकी जरुरत अभी होगी ? बिल्कुल नहीं | इसकी जरुरत exam hall में पहुँचने पर होगी | फिर भी आपके parent यह जानते हैं कि अगर hall-ticket, extra pen आपके पास नहीं होगी तो आपका exam proper (सही) तरीके से नहीं होगा | इसलिए parent याद दिलाते हैं कि यह सारी चीजे जरूर ले लेना |

ठीक उसी तरह java में Compiler होता है जो यहाँ parent की भूमिका निभाता है, वह हमारे program में यदि कोई exception होने वाला है वो पहले से ही check कर लेता है और उसे handle करने के लिए कहता है |

Checked exception :

हमारे program का execution, run time पर आसानी से हो जाए, इसलिए compiler कुछ exception को पहले से ही check कर लेता है | compile यह भी check करता है कि वह exception programmer द्वारा properly handle हुआ है कि नहीं | ऐसे exception को Checked exception अथवा compile time exception कहते हैं |

RuntimeException class तथा उसके सभी sub class को छोड़कर, सारे sub class जो Exception class से लिए गए है वह सभी checked exception हैं |

इन exceptions को handle करना जरुरी होता है वरना हमारा program compile नहीं होता | Exception को handle करने के बहुत से तरीके हैं, जिन्हे हम कुछ समय में जानेगे |

Uncheck exception :

कुछ ऐसे exception होते हैं, जिन्हे compiler नहीं check करता | चाहे programmer उसे handle करे या न करे compiler को इसकी कोई चिंता नहीं होती | ऐसे exception को Unchecked exception अथवा runtime exception कहते हैं |

ध्यान दो, सारे के सारे Exception हमेशा run time पर ही occur होते हैं, compile time पर कोई भी exception occur नहीं होता |

RuntimeException class और इसके सभी sub class Unchecked exception हैं |

NOTE: Error class तथा इसके सभी subclass/child class Unchecked हैं | programmer Error को handle नहीं कर सकता, क्योकि यह non-recoverable हैं |

जब program में checked exception है, और हम उसे handle/declare नहीं करते तब तक program compile नहीं होगा |

जब program में सिर्फ unchecked  exception है तब program तो आसानी से compile हो जाएगा परन्तु runtime पर exception throw कर देगा और program abnormally terminate हो जाएगा |

इसलिए Exception को handle करना जरुरी है |

How to handle exception ?

5 keywords का use करके हम Exception को handle कर सकते हैं |

1. try 2. catch 3. finally 4. Throw 5. Throws

इनमें से 3 keywords try, catch और finally को हम इस post में discuss करेंगे और बाकी के दो keywords throw और throws को हम अगले post में जानेंगे |

1. try { } और catch() { } block

Program का वह code जो हमें risky/suspicious (संदेहजनक) लगता है, जिसमे exception occur होने के chances होते हैं, उसे हम try { } block के अंदर लिखते हैं और ठीक उसके बाद catch(){ }  block के अंदर exception को handle करने के लिए code लिखते हैं |

NOTE: यह programmer पर depend करता है कि वह exception को कैसे handle करे | वह चाहे तो केवल exception information को भी print करा सकता है | वह चाहे तो user को कोई message भी दे सकता है |

Syntax:

try
{
	//Risky code
}catch(ExceptionClassName referenceVariableName)
{
	//ExceptionHandling code
}

आइए अब program 2 में occur हुए exception को try और catch की सहायता से handle करें |

Program 3:

public class DefaultExceptionHandlerDemo_withException {

	public static void main(String[] args) {
		m2();
	}

	static void m2() {
		m1();
	}

	static void m1() {
		System.out.println("Hello");
		try {
			System.out.println(10 / 0);
		} catch (Exception e) {
			e.printStackTrace(); 				// print Exception object information
			System.out.println("You cannot divide by zero, please do changes in program");
		}
		System.out.println("How are you");
	}
}

OutPut:

Hello
java.lang.ArithmeticException: / by zero
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m1(DefaultExceptionHandlerDemo_withException.java:16)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.m2(DefaultExceptionHandlerDemo_withException.java:10)
	at com.exceptionHandling.DefaultExceptionHandlerDemo_withException.main(DefaultExceptionHandlerDemo_withException.java:6)
You cannot divide by zero, please do changes in program
How are you

Explanation:

ऊपर program 3 में,

System.out.println(10 / 0); यह risky code है, इसलिए इसे हमने try{ } block के अंदर लिखा और catch में parameter (Exception e) pass किया और { } block में e.printStackTrace() का use करके Exception के information को print कराया साथ ही साथ user को message भी दिया की वह zero से divide नहीं कर सकता |

ध्यान दो यहाँ exception के बाद वाली line System.out.println(“How are you”); भी execute हुआ है, जो कि program 2 में नहीं हुआ था |

हम catch block के अंदर Exception की जगह ArithmeticException भी लिख सकते हैं, क्योकि यहाँ हमें पता है कि यह exception आ सकता है | परन्तु जब हमें होने वाले exception का अंदाजा न हो उस स्थिति में ही Exception लिखना चाहिए |

Ways to print exception information:

Exception information को print कराने के लिए कुल 4 तरीके हैं |

1. e.printStackTrace()

यह Name, Description और StackTrack/location तीनों print करेगा |

2. System.out.println(e)

यह केवल Name और Description ही print करेगा | Location print नहीं करेगा |

3. System.out.println(e.toString())

यह भी केवल Name और Description ही print करेगा | Location print नहीं करेगा |

4. System.out.println(e.getMessage())

यह केवल Description ही print करेगा | Name तथा Location print नहीं करेगा |

ऊपर के चारों methods में से सबसे ज्यादा e.printStackTrace() को use किया जाता है |

आइए अब जानते हैं कि program के अंदर Exception मिलने या फिर न मिलने की स्थिति में try catch के अंदर Exception flow किस तरह होता है |

Control-Flow inside try-catch:

Case 1 : जबकोई exception occur न हो

Program 4:

public class ControlFlowInSideTryCatch {

	public static void main(String[] args) {
		try {
			System.out.println("Statement 1");
			System.out.println("Statement 2");
			System.out.println("Statement 3");
		} catch (Exception e) {
			System.out.println("Statement 4");
		}
		System.out.println("Statement 5");
	}
}

OutPut:

Statement 1
Statement 2
Statement 3
Statement 5

Explanation:

ऊपर program 4 में, कोई भी exception occur नहीं हुआ इसलिए try के अंदर के सारे statement execute हुए | catch block execute नहीं हुआ | statement 5 भी  execute हुआ जो कि try catch से बाहर है | program normally terminate हुआ है |

Case 2 : जब exception occur हो और catch() में दिया गया className match हो जाए |

Program 5 :

public class ControlFlowInSideTryCatch {

	public static void main(String[] args) {
		try {
			System.out.println("Statement 1");
			System.out.println(10 / 0);
			System.out.println("Statement 2");
			System.out.println("Statement 3");
		} catch (ArithmeticException e) {
			System.out.println("Statement 4");
		}
		System.out.println("Statement 5");
	}
}

OutPut:

Statement 1
Statement 4
Statement 5

Explanation:

ऊपर program 5 में, statement 1 execute होने के ठीक बाद Exception occur हो गया, जिससे control direct catch block में चला गया, क्योकि यहाँ catch में दिया गया exception name match हो गया, इसलिए statement 4 execute हुआ और अंत में statement 5 भी execute हुआ | यहाँ exception handling के कारण program normally terminate हुआ है |

ध्यान दो, यहाँ exception occur होने के बाद statement 2 और statement 3 दोनों ही execute नहीं हुए |

मान लो, आपके program में total 1000 statements हैं, और आपने सारे के सारे statements को try { } block में लिखा है, तब उस स्थिति में यदि statement 1 के बाद ही exception occur हो गया हो तो, बचा हुआ 999 statements execute नहीं होगा |

NOTE: Programmer को हमेशा जितना हो सके, कम से कम code ही try { } block के अंदर लिखना चाहिए |

सारे के सारे code को try { } में लिखना avoid करना चाहिए, जो statement risky लगे सिर्फ उसे ही try {} block में लिखना चाहिए |

Case 3 : जब exception occur हो और catch() में दिया गया className match न हो |

Program 6:

public class ControlFlowInSideTryCatch {

	public static void main(String[] args) {
		try {
			System.out.println("Statement 1");
			System.out.println(10 / 0);
			System.out.println("Statement 2");
			System.out.println("Statement 3");
		} catch (NullPointerException e) {
			System.out.println("Statement 4");
		}
		System.out.println("Statement 5");
	}
}

OutPut:

Statement 1
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.exceptionHandling.ControlFlowInSideTryCatch.main(ControlFlowInSideTryCatch.java:6)

Explanation:

ऊपर के program 6 में, statement 1 execute होने के ठीक बाद exception occur हो गया, परन्तु catch() me लिखा Exception Name match नहीं हुआ, इसलिए statement 4 execute नहीं हुआ और program abnormally terminate हो गया, जिससे statement 5 भी execute नहीं हुआ |

NOTE: catch () { } block हमेशा exception occur होने के साथ ही साथ ExceptionName match होने पर ही execute होगा |

2. finally { } block:

finally { } block के अंदर हम उस code को लिखते हैं, जिसे हर हालत में execute करना होता है |

कहने का मतलब है, finally { } block में लिखा गया हर कोड हमेशा execute होगा, program में चाहे Exception occur हो या न हो, exception occur होने पर catch में लिखा Exception Name match हो या न हो |

Syntax:

try
{
	//Risky code
}catch(ExceptionClassName referenceVariableName)
{
	//ExceptionHandling code
}finally
{
	//cleanUpCode..always execute
}

Program 7:

public class ControlFlowInSideTryCatchFinally {

	public static void main(String[] args) {
		try {
			System.out.println("Statement 1");
			System.out.println(10 / 0);
			System.out.println("Statement 2");
			System.out.println("Statement 3");
		} catch (NullPointerException e) {
			System.out.println("Statement 4");
		} finally {
			System.out.println("Statement 5");
		}
	}
}

OutPut:

Statement 1
Statement 5
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.exceptionHandling.ControlFlowInSideTryCatchFinally.main(ControlFlowInSideTryCatchFinally.java:6)

Explanation:

ऊपर program 7 में, statement 1 execute होने के ठीक बाद exception occur हो गया, परन्तु catch() में लिखा Exception Name match नहीं हुआ, इसलिए statement 4 execute नहीं हुआ |

ध्यान दो, यहाँ statement 5 भी execute हुआ है, क्योकि हमने उसे finally { } block में लिखा है |

NOTE:

1. यदि try { } block में control transfer statements (jump statements) जैसे return, break या फिर continue, लिखा होगा उस स्थिति में भी finally block में लिखा गया statement जरूर execute होगा |

2. हम try{ } block के साथ multiple catch(){ } block use कर सकते हैं |

3. try { } block को हम अकेले भी use कर सकते हैं, परन्तु उस स्थिति में चूँकि हम catch(){ } नहीं use कर रहे इसलिए program में exception occur होने पर भी कोई वह handle नहीं होगा |

4. हम सिर्फ try{ } और finally{ } भी लिख सकते हैं, परन्तु एक try के साथ हमेशा केवल एक ही finally { } लिख सकते हैं,multiple नहीं |

5. finally { } block को कभी भी अकेले नहीं लिख सकते |6. exception को किस तरह handle करना है, यह सिर्फ catch (){ } block में ही लिखा जाता है |

Conclusion – आज आपने क्या सीखा

इस post में आपने Exception, uske types और उसे कैसे handle करते हैं इन सब के बारे में विस्तृत जानकारी प्राप्त की |

आशा है कि, आपको मेरा यह Blog Exception Handling in Java in Hindi जरूर पसंद आया होगा |

अगर आप इस post से related कोई सवाल पूँछना चाहते हैं अथवा कोई सुझाव देना चाहते हैं तो comment करके जरूर बताएं, मैं उसका reply जरूर दूँगा |

इस post को अपना कीमती समय देने के लिए बहुत बहुत धन्यवाद् | फिर मिलेंगें |

Leave a Comment