హలో! నేటి పాఠంలో, మేము జావా మినహాయింపుల గురించి మాట్లాడుతాము. దైనందిన జీవితం మనం ఊహించని పరిస్థితులతో నిండి ఉంటుంది. ఉదాహరణకు, మీరు ఉదయం పని కోసం లేచి మీ ఫోన్ ఛార్జర్ కోసం వెతుకుతారు, కానీ మీకు అది ఎక్కడా కనిపించదు. మీరు స్నానం చేయడానికి బాత్రూమ్కి వెళ్లి పైపులు స్తంభింపజేసినట్లు తెలుసుకుంటారు. మీరు మీ కారులో ఎక్కండి, కానీ అది ప్రారంభం కాదు. అలాంటి అనూహ్య పరిస్థితులను మానవుడు చాలా తేలికగా ఎదుర్కోగలడు. ఈ వ్యాసంలో, జావా ప్రోగ్రామ్లు వాటితో ఎలా వ్యవహరిస్తాయో తెలుసుకోవడానికి మేము ప్రయత్నిస్తాము.
జావా మినహాయింపు ఏమిటి?
ప్రోగ్రామింగ్ ప్రపంచంలో, ప్రోగ్రామ్ అమలులో లోపాలు మరియు ఊహించలేని పరిస్థితులను మినహాయింపులు అంటారు. ప్రోగ్రామ్లో, చెల్లని వినియోగదారు చర్యలు, తగినంత డిస్క్ స్థలం లేదా సర్వర్తో నెట్వర్క్ కనెక్షన్ కోల్పోవడం వల్ల మినహాయింపులు సంభవించవచ్చు. మినహాయింపులు ప్రోగ్రామింగ్ లోపాలు లేదా API యొక్క తప్పు ఉపయోగం వలన కూడా సంభవించవచ్చు. వాస్తవ ప్రపంచంలోని మానవులలా కాకుండా, ఈ పరిస్థితులను ఎలా నిర్వహించాలో ప్రోగ్రామ్ ఖచ్చితంగా తెలుసుకోవాలి. దీని కోసం, జావాకు మినహాయింపు నిర్వహణ అని పిలువబడే ఒక యంత్రాంగాన్ని కలిగి ఉంది.కీలక పదాల గురించి కొన్ని మాటలు
జావాలో మినహాయింపు నిర్వహణ ప్రోగ్రామ్లోని క్రింది కీలకపదాల ఉపయోగంపై ఆధారపడి ఉంటుంది:- ప్రయత్నించండి - మినహాయింపు సంభవించే కోడ్ బ్లాక్ను నిర్వచిస్తుంది;
- క్యాచ్ - మినహాయింపులు నిర్వహించబడే కోడ్ బ్లాక్ను నిర్వచిస్తుంది;
- చివరగా - కోడ్ యొక్క ఐచ్ఛిక బ్లాక్ని నిర్వచిస్తుంది, అది ఉనికిలో ఉంటే, ట్రై బ్లాక్ ఫలితాలతో సంబంధం లేకుండా అమలు చేయబడుతుంది.
- త్రో - మినహాయింపును పెంచడానికి ఉపయోగిస్తారు;
- విసురుతాడు - పద్ధతి మినహాయింపును విసిరివేయవచ్చని హెచ్చరించడానికి పద్ధతి సంతకంలో ఉపయోగించబడుతుంది.
// This method reads a string from the keyboard
public String input() throws MyException { // Use throws to warn
// that the method may throw a MyException
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = null;
// We use a try block to wrap code that might create an exception. In this case,
// the compiler tells us that the readLine() method in the
// BufferedReader class might throw an I/O exception
try {
s = reader.readLine();
// We use a catch block to wrap the code that handles an IOException
} catch (IOException e) {
System.out.println(e.getMessage());
// We close the read stream in the finally block
} finally {
// An exception might occur when we close the stream if, for example, the stream was not open, so we wrap the code in a try block
try {
reader.close();
// Handle exceptions when closing the read stream
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if (s.equals("")) {
// We've decided that an empty string will prevent our program from working properly. For example, we use the result of this method to call the substring(1, 2) method. Accordingly, we have to interrupt the program by using throw to generate our own MyException exception type.
throw new MyException("The string cannot be empty!");
}
return s;
}
మనకు మినహాయింపులు ఎందుకు అవసరం?
వాస్తవ ప్రపంచం నుండి ఒక ఉదాహరణ చూద్దాం. హైవే యొక్క ఒక విభాగంలో పరిమిత బరువు సామర్థ్యంతో చిన్న వంతెన ఉందని ఊహించండి. వంతెన పరిమితికి మించి బరువైన కారు దాని మీదుగా వెళితే, అది కూలిపోవచ్చు. డ్రైవర్ పరిస్థితి తేలికగా చెప్పాలంటే, అసాధారణమైనది. దీన్ని నివారించేందుకు రవాణా శాఖ ఏదైనా ప్రమాదం జరగకముందే రోడ్డుపై హెచ్చరిక బోర్డులను ఏర్పాటు చేస్తుంది. హెచ్చరిక గుర్తును చూసి, డ్రైవర్ తన వాహనం యొక్క బరువును వంతెన గరిష్ట బరువుతో పోల్చాడు. వాహనం చాలా బరువుగా ఉంటే, డ్రైవర్ బైపాస్ మార్గాన్ని తీసుకుంటాడు. రవాణా శాఖ, మొదట, ట్రక్కు డ్రైవర్లు అవసరమైతే వారి రూట్ను మార్చుకునే అవకాశాన్ని కల్పించింది, రెండవది, ప్రధాన రహదారిపై ప్రమాదాల గురించి డ్రైవర్లను హెచ్చరించింది మరియు మూడవది, కొన్ని పరిస్థితులలో వంతెనను ఉపయోగించకూడదని డ్రైవర్లను హెచ్చరించింది. ప్రోగ్రామ్లో అసాధారణమైన పరిస్థితులను నిరోధించే మరియు పరిష్కరించగల సామర్థ్యం, అది అమలులో కొనసాగడానికి అనుమతించడం, జావాలో మినహాయింపులను ఉపయోగించడానికి ఒక కారణం. మినహాయింపు మెకానిజం ఏదైనా ఇన్పుట్లను ధృవీకరించడం (చెక్ చేయడం) ద్వారా మీ కోడ్ (API)ని సరికాని ఉపయోగం నుండి రక్షించడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇప్పుడు మీరు రవాణా శాఖ అని ఊహించుకోండి. ముందుగా, వాహనదారులు ఇబ్బందిని ఆశించే ప్రదేశాలను మీరు తెలుసుకోవాలి. రెండవది, మీరు హెచ్చరిక సంకేతాలను సృష్టించి, ఇన్స్టాల్ చేయాలి. చివరకు, ప్రధాన మార్గంలో సమస్యలు తలెత్తితే మీరు డొంకలను అందించాలి. జావాలో, మినహాయింపు యంత్రాంగం ఇదే విధంగా పనిచేస్తుంది. అభివృద్ధి సమయంలో, కోడ్లోని ప్రమాదకరమైన విభాగాల చుట్టూ "మినహాయింపు అడ్డంకులు" నిర్మించడానికి మేము ట్రై బ్లాక్ని ఉపయోగిస్తాము, మేము క్యాచ్ {} ని ఉపయోగించి "బ్యాకప్ మార్గాలను" అందిస్తాము.బ్లాక్ చేయండి మరియు మేము కోడ్ని వ్రాస్తాము, ఆ కోడ్ని చివరగా{} బ్లాక్లో ఏది ఉన్నా అమలు చేయాలి . మేము "బ్యాకప్ మార్గాన్ని" అందించలేకపోతే లేదా వినియోగదారుని ఎంచుకునే హక్కును అందించాలనుకుంటే, మనం కనీసం అతనికి లేదా ఆమెకు ప్రమాదం గురించి హెచ్చరించాలి. ఎందుకు? ఒక్క హెచ్చరిక బోర్డు కూడా చూడకుండా, తాను దాటలేని చిన్న వంతెనపైకి చేరుకున్న డ్రైవర్ యొక్క ఆగ్రహాన్ని ఊహించుకోండి! ప్రోగ్రామింగ్లో, మా తరగతులు మరియు పద్ధతులను వ్రాసేటప్పుడు, ఇతర డెవలపర్లు వాటిని ఎలా ఉపయోగించవచ్చో మేము ఎల్లప్పుడూ ఊహించలేము. ఫలితంగా, అసాధారణమైన పరిస్థితిని పరిష్కరించడానికి మేము 100% సరైన మార్గాన్ని ఊహించలేము. అసాధారణమైన పరిస్థితుల అవకాశం గురించి ఇతరులను హెచ్చరించడం మంచి రూపం. జావా యొక్క మినహాయింపు విధానం త్రోలతో దీన్ని అనుమతిస్తుందికీవర్డ్ — తప్పనిసరిగా మా పద్ధతి యొక్క సాధారణ ప్రవర్తన మినహాయింపును విసరడాన్ని కలిగి ఉంటుంది. అందువల్ల, పద్ధతిని ఉపయోగించే ఎవరికైనా అతను లేదా ఆమె మినహాయింపులను నిర్వహించడానికి కోడ్ రాయాలని తెలుసు."ఇబ్బంది" గురించి ఇతరులను హెచ్చరించడం
మీరు మీ పద్ధతిలో మినహాయింపులను నిర్వహించడానికి ప్లాన్ చేయకపోతే, మినహాయింపులు సంభవించవచ్చని ఇతరులను హెచ్చరించాలనుకుంటే, త్రోస్ కీవర్డ్ని ఉపయోగించండి . మెథడ్ సిగ్నేచర్లోని ఈ కీవర్డ్ అంటే, కొన్ని షరతులలో, పద్ధతి మినహాయింపును ఇవ్వవచ్చు. ఈ హెచ్చరిక మెథడ్ ఇంటర్ఫేస్లో భాగం మరియు దాని వినియోగదారులు వారి స్వంత మినహాయింపు నిర్వహణ తర్కాన్ని అమలు చేయడానికి అనుమతిస్తుంది. త్రోల తర్వాత, మేము విసిరిన మినహాయింపుల రకాలను పేర్కొంటాము. ఇవి సాధారణంగా జావా యొక్క మినహాయింపు తరగతి నుండి వస్తాయి. జావా ఆబ్జెక్ట్-ఓరియెంటెడ్ లాంగ్వేజ్ కాబట్టి, అన్ని మినహాయింపులు జావాలోని వస్తువులు.మినహాయింపు సోపానక్రమం
ప్రోగ్రామ్ రన్ అవుతున్నప్పుడు లోపం సంభవించినప్పుడు, JVM జావా మినహాయింపు సోపానక్రమం నుండి తగిన రకానికి చెందిన వస్తువును సృష్టిస్తుంది - ఇది సాధారణ పూర్వీకుల నుండి వచ్చిన మినహాయింపుల సమితి - త్రోయబుల్ క్లాస్ . మేము అసాధారణమైన రన్టైమ్ పరిస్థితులను రెండు గ్రూపులుగా విభజించవచ్చు:- ప్రోగ్రామ్ పునరుద్ధరించలేని మరియు సాధారణ కార్యాచరణను కొనసాగించలేని పరిస్థితులు.
- రికవరీ సాధ్యమయ్యే పరిస్థితులు.
మినహాయింపును సృష్టిస్తోంది
ప్రోగ్రామ్ నడుస్తున్నప్పుడు, మినహాయింపులు JVM ద్వారా లేదా త్రో స్టేట్మెంట్ని ఉపయోగించి మానవీయంగా రూపొందించబడతాయి. ఇది జరిగినప్పుడు, మెమరీలో ఒక మినహాయింపు వస్తువు సృష్టించబడుతుంది, ప్రోగ్రామ్ యొక్క ప్రధాన ప్రవాహం అంతరాయం కలిగిస్తుంది మరియు JVM యొక్క మినహాయింపు హ్యాండ్లర్ మినహాయింపును నిర్వహించడానికి ప్రయత్నిస్తుంది.మినహాయింపు నిర్వహణ
Javaలో, మేము కోడ్ బ్లాక్లను సృష్టిస్తాము, ఇక్కడ మేము ట్రై{}క్యాచ్ , ట్రై{}క్యాచ్{}చివరిగా , మరియు ట్రై{}చివరిగా{} నిర్మాణాలను ఉపయోగించి మినహాయింపు నిర్వహణ అవసరాన్ని అంచనా వేస్తాము . ట్రై బ్లాక్లో మినహాయింపు విసిరినప్పుడు , JVM తదుపరి క్యాచ్ బ్లాక్లో తగిన మినహాయింపు హ్యాండ్లర్ కోసం చూస్తుంది. క్యాచ్ బ్లాక్కు అవసరమైన మినహాయింపు హ్యాండ్లర్ ఉంటే , నియంత్రణ దానికి వెళుతుంది. కాకపోతే, తగిన హ్యాండ్లర్ కనుగొనబడే వరకు JVM క్యాచ్ బ్లాక్ల గొలుసును మరింత క్రిందికి చూస్తుంది. క్యాచ్ బ్లాక్ని అమలు చేసిన తర్వాత , నియంత్రణ ఐచ్ఛిక చివరి బ్లాక్కి బదిలీ చేయబడుతుంది. తగిన క్యాచ్ ఉంటేబ్లాక్ కనుగొనబడలేదు, ఆపై JVM ప్రోగ్రామ్ను ఆపివేస్తుంది మరియు స్టాక్ ట్రేస్ను (మెథడ్ కాల్ల ప్రస్తుత స్టాక్) ప్రదర్శిస్తుంది, అది ఉనికిలో ఉన్నట్లయితే చివరగా బ్లాక్ను ప్రదర్శించిన తర్వాత. మినహాయింపు నిర్వహణకు ఉదాహరణ:
public class Print {
void print(String s) {
if (s == null) {
throw new NullPointerException("Exception: s is null!");
}
System.out.println("Inside print method: " + s);
}
public static void main(String[] args) {
Print print = new Print();
List list= Arrays.asList("first step", null, "second step");
for (String s : list) {
try {
print.print(s);
}
catch (NullPointerException e) {
System.out.println(e.getMessage());
System.out.println("Exception handled. The program will continue");
}
finally {
System.out.println("Inside finally block");
}
System.out.println("The program is running...");
System.out.println("-----------------");
}
}
}
ప్రధాన పద్ధతి యొక్క ఫలితాలు ఇక్కడ ఉన్నాయి :
Inside print method: first step
Inside finally block
The program is running...
-----------------
Exception: s is null!
Exception handled. The program will continue
Inside finally block
The program is running...
-----------------
Inside print method: second step
Inside finally block
The program is running...
-----------------
చివరగా ఏదైనా స్ట్రీమ్లను మూసివేయడానికి మరియు ట్రై బ్లాక్లో తెరిచిన/కేటాయిస్తున్న ఏవైనా వనరులను ఖాళీ చేయడానికి సాధారణంగా ఉపయోగించబడుతుంది . అయినప్పటికీ, ప్రోగ్రామ్ను వ్రాసేటప్పుడు, అన్ని వనరుల మూసివేతను ట్రాక్ చేయడం ఎల్లప్పుడూ సాధ్యం కాదు. మన జీవితాలను సులభతరం చేయడానికి, Java డెవలపర్లు ట్రై-విత్-రిసోర్సెస్ నిర్మాణాన్ని అందిస్తారు, ఇది ట్రై బ్లాక్లో తెరిచిన ఏవైనా వనరులను స్వయంచాలకంగా మూసివేస్తుంది. మా మొదటి ఉదాహరణను వనరులతో ప్రయత్నించి తిరిగి వ్రాయవచ్చు :
public String input() throws MyException {
String s = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
s = reader.readLine();
} catch (IOException e) {
System.out.println(e.getMessage());
}
if (s.equals("")) {
throw new MyException ("The string cannot be empty!");
}
return s;
}
వెర్షన్ 7లో ప్రవేశపెట్టిన జావా సామర్థ్యాలకు ధన్యవాదాలు, మేము క్యాచింగ్ హెటెరోజెనియస్ మినహాయింపులను ఒక బ్లాక్లో కలపవచ్చు, కోడ్ని మరింత కాంపాక్ట్ మరియు రీడబుల్గా మార్చవచ్చు. ఉదాహరణ:
public String input() {
String s = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
s = reader.readLine();
if (s.equals("")) {
throw new MyException("The string cannot be empty!");
}
} catch (IOException | MyException e) {
System.out.println(e.getMessage());
}
return s;
}
GO TO FULL VERSION