2013-10-22 6 views
5

मैंने देखा है कि इन दोनों को, उदाहरण के लिए, काम कर रहे हैं:मुझे "फेंकने" की घोषणा कब करनी चाहिए, और कब नहीं?

जब मैं throws anException की घोषणा करनी चाहिए, और जब नहीं है, और इसके बारे में सिर्फ घोषित बिना फेंक:

public void func(int a) throws IllegalArgumentException { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 

public void func(int a) { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 

यह मुझे पूछने के लिए बनाता है ?

उत्तर

4

चेक अपवाद हमेशा विधि हस्ताक्षर में लिखा जाना चाहिए कि यह throws है।

तो अपवादextend RuntimeException, आप विधि नाम पर throws लिखने के लिए नहीं है, लेकिन यह अत्यधिक की सिफारिश की है, क्योंकि यह स्पष्ट है और यह विधि के दस्तावेज में उल्लेख किया जाएगा।

/** 
* @throws This won't appear if you don't write `throws` and this might 
* mislead the programmer. 
*/ 
public void func(int a) throws IllegalArgumentException { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 
2

JLS section 11.2 से:

जावा प्रोग्रामिंग भाषा है कि एक प्रोग्राम जांचे हुए अपवादों जो एक विधि या निर्माता के निष्पादन से परिणाम कर सकते के लिए संचालकों में शामिल है की आवश्यकता है। प्रत्येक चेक अपवाद के लिए जो संभव है परिणाम, विधि (§8.4.6) या कन्स्ट्रक्टर (§8.8.5) के लिए फेंकता खंड उस अपवाद की श्रेणी का उल्लेख करना चाहिए या उस श्रेणी के सुपरक्लास अपवाद (§11.2.3)।

इसलिए संक्षेप में, आप throws बयान की जरूरत है एक अपवाद जाँच है। यदि आपके पास Exception है, और यह RuntimeException का उप-वर्ग नहीं है, तो यह चेक किया गया है।

IllegalArgumentExceptionRuntimeException का उप-वर्ग है, और इसलिए यह अनचेक है, और आपको इसे फेंकने वाले कथन में घोषित करने की आवश्यकता नहीं है। यह इस तरह के अधिकांश अपवादों के बारे में सच है (IllegalArgumentException, NullPtrException इत्यादि) क्योंकि आप आसानी से इन्हें संभालने की अपेक्षा नहीं कर सकते हैं।

1

जब आपका अपवाद चेक किया गया है तो आप कंपाइलर द्वारा अपवाद को पकड़ने या घोषित घोषणा की घोषणा करने के लिए बाध्य हैं।
चेक बनाम अनचेक अपवादों की तुलना के लिए this पोस्ट की जांच करें।

2

सौंदर्य के साथ सौंदर्य यह है कि अपवाद चेक अपवाद में परिवर्तित हो जाता है इस प्रकार जब भी कोई डेवलपर पहले दृष्टिकोण का उपयोग करने की कोशिश करेगा तो उसे अपने हस्ताक्षर में फेंकने वाली विधि को कॉल करने से पहले एक कोशिश-पकड़ ब्लॉक लगाने के लिए चेतावनी दी जाएगी।

1

ऐसा इसलिए है क्योंकि IllegalArgumentException extends RuntimeException। आप नीचे की तरह फेंकने वाले खंड को छोड़ नहीं सकते हैं।

public void func(int a) { 
    if(a == 0) 
     throw new Exception("a should be greater than 0."); 
} 
1

कई तकनीकी जवाब है कि JLS धारा 1.2, जांचे हुए अपवादों आदि जो इसका इस्तेमाल बताते हैं किया गया है।
लेकिन आपके सवाल का

मैं जब घोषणा करनी चाहिए एक अपवाद फेंकता है, और जब नहीं है, और इसके बारे में सिर्फ घोषित बिना फेंक?

अपने कोड कुछ स्पष्ट अपवाद पैदा करने और उसे फेंकने रहा है, तो आप हमेशा समारोह जिसके लिए प्रलेखन टैग उत्पन्न होगा ऊपर जोड़ना चाहिए खंड फेंकता है और आप प्रलेखन उत्पन्न करनी चाहिए सिर्फ लिख कर/** आप। इससे आपकी अन्य लाइब्रेरी या फ़ंक्शंस का उपयोग करने वाले अन्य सभी उपयोगकर्ताओं की सहायता मिलेगी, कुछ फ़ंक्शन या कन्स्ट्रक्टर अपवाद फेंकने के लिए बाध्य हैं यदि कुछ अमान्य तर्क या कुछ मान इस फ़ंक्शन के कॉल से पहले प्रारंभ नहीं किए गए हैं।

उदाहरण,

/** 
* 
* @param filePath File path for the file which is to be read 
* @throws FileNotFoundException In case there exists no file at specified location 
* @throws IllegalArgumentException In case when supplied string is null or whitespace 
*/ 
public static void ReadFile(String filePath) throws FileNotFoundException, IllegalArgumentException 
{ 
    if(filePath == null || filePath == "") 
    throw new IllegalArgumentException(" Invalid arguments are supplied "); 
    File fil = new File(filePath); 
    if(!fil.exists()|| fil.isDirectory()) 
     throw new FileNotFoundException(" No file exist at specified location " + filePath); 
    //..... Rest of code to read file and perform necessay operation 
} 

इन प्रलेखन टैग और फेंकता प्रोग्रामर जीवन आसान जो अपने कोड पुन: उपयोग करेगा और अगर समारोह के साथ शुरू हो जाती है पहले से पता होगा कि IllegalArgumentException, FileNotFoundException फेंक दिया जाएगा बनाने के लिए इसके अलावा रहे हैं गलत पैरामीटर या फ़ाइल निर्दिष्ट स्थान पर उपलब्ध नहीं है।

तो यदि आप चाहते हैं कि आपका कोड और कार्य स्वयं व्याख्यात्मक हैं और सभी आवश्यक मामलों को प्रदान करते हैं तो को कौन से अपवाद फेंक दिए जाते हैं अन्यथा यह आपकी पसंद है।
याद रखें, अगर आप 3012 दिनों के बाद का उपयोग कर रहे हैं (मुझे यकीन है कि आप इसे भविष्य में फिर से उपयोग करने जा रहे हैं) उन फ़ंक्शंस तो यह अधिक उपयोगी होगा और आपको केवल उन खंडों के बारे में पता चलेगा जो मैं उस समारोह में किया था।

0

आप जांचे हुए अपवादों की घोषणा करने की जरूरत है, वहीं अनियंत्रित अपवाद की जरूरत नहीं है एक विधि में घोषित करने या निर्माता के खंड फेंकता है तो वे विधि या निर्माता के निष्पादन .. से द्वारा फेंका जा सकता है - http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html

संबंधित मुद्दे

 संबंधित मुद्दे