3. रॅपिंग अपवाद

तपासलेले अपवाद सैद्धांतिकदृष्ट्या छान वाटत होते, परंतु व्यवहारात ते प्रचंड निराशाजनक ठरले.

समजा तुमच्या प्रोजेक्टमध्ये एक सुपर लोकप्रिय पद्धत आहे. तुमच्या कार्यक्रमात शेकडो ठिकाणांहून बोलावले जाते. आणि तुम्ही त्यात एक नवीन चेक केलेला अपवाद जोडण्याचे ठरवता . आणि असे असू शकते की हा तपासलेला अपवाद खरोखरच महत्त्वाचा आणि इतका विशेष आहे की main()तो पकडला गेला तर काय करावे हे केवळ पद्धतीलाच माहीत आहे.

याचा अर्थ तुम्हाला तुमची सुपर पॉप्युलर पद्धत म्हणणाऱ्या प्रत्येक पद्धतीच्या क्लॉजमध्ये चेक केलेला अपवाद जोडावा लागेलthrows . तसेच throwsत्या पद्धती म्हणणाऱ्या सर्व पद्धतींच्या क्लॉजमध्ये. आणि ज्या पद्धतींना त्या पद्धती म्हणतात.

परिणामी, throwsप्रकल्पातील अर्ध्या पद्धतींच्या कलमांना नवीन चेक केलेला अपवाद मिळतो. आणि अर्थातच तुमचा प्रकल्प चाचण्यांनी व्यापलेला आहे आणि आता चाचण्या संकलित होत नाहीत. आणि आता तुम्हाला तुमच्या चाचण्यांमधील थ्रो क्लॉज देखील संपादित करावे लागतील.

आणि मग तुमचे सर्व कोड (शेकडो फाईल्समधील सर्व बदल) इतर प्रोग्रामरद्वारे पुनरावलोकन करावे लागतील. आणि या टप्प्यावर आम्ही स्वतःला विचारतो की आम्ही प्रकल्पात इतके रक्तरंजित बदल का केले? कामाचे दिवस आणि तुटलेल्या चाचण्या - हे सर्व एक चेक केलेला अपवाद जोडण्यासाठी ?

आणि अर्थातच, वारसा आणि पद्धत ओव्हरराइडिंगशी संबंधित समस्या अजूनही आहेत. तपासलेल्या अपवादांमधून आलेल्या समस्या फायद्यापेक्षा खूप मोठ्या आहेत. मुख्य गोष्ट अशी आहे की आता काही लोक त्यांच्यावर प्रेम करतात आणि काही लोक त्यांचा वापर करतात.

तथापि, अजूनही बरेच कोड आहे (मानक Java लायब्ररी कोडसह) ज्यात हे तपासलेले अपवाद आहेत. त्यांच्यासोबत काय करायचं? आम्ही त्यांच्याकडे दुर्लक्ष करू शकत नाही आणि त्यांना कसे हाताळायचे हे आम्हाला माहित नाही.

जावा प्रोग्रामरने चेक केलेले अपवाद मध्ये गुंडाळण्याचा प्रस्ताव दिला RuntimeException. दुसऱ्या शब्दांत, सर्व चेक केलेले अपवाद पकडा आणि नंतर अनचेक अपवाद तयार करा (उदाहरणार्थ, RuntimeException) आणि त्याऐवजी फेकून द्या. असे केल्याने असे दिसते:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

हा एक अतिशय सुंदर उपाय नाही, परंतु येथे काहीही गुन्हेगार नाही: अपवाद फक्त एक मध्ये भरलेला होता RuntimeException.

इच्छित असल्यास, आपण तेथून सहजपणे पुनर्प्राप्त करू शकता. उदाहरण:

कोड नोंद
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







ऑब्जेक्टमध्ये संग्रहित अपवाद मिळवा RuntimeException. व्हेरिएबल causeकदाचित null

त्याचा प्रकार निश्चित करेल आणि त्यास चेक केलेल्या अपवाद प्रकारात रूपांतरित करेल.