2010-04-13 15 views
12

मेरे पास कक्षाएं DirReader और खोज हैं। खोज DirReader का उपयोग करता है। मैं खोज जानना चाहता हूं कि DirReader अपवाद फेंकता है। तो मैं वर्ग फेंकने का अपवाद कैसे कर सकता हूं?जावा: अपवाद-फेंकने वाला वर्ग?

वर्तमान में, मैं initCorrect -dummy var का उपयोग करता हूं। अपवाद-शैली विधि अधिक उपयुक्त हो सकती है।

सरलीकृत उदाहरण त्रुटि

$ javac ExceptionStatic.java 
ExceptionStatic.java:4: '{' expected 
public class ExceptionStatic throws Exception{ 
          ^
1 error 

कोड

import java.util.*; 
import java.io.*; 

// THIS PART NEEDS TO BE FIXED: 
public class ExceptionStatic throws Exception{ 

    private static boolean initCorrect = false; 

    public static String hello; 
    static{ 
     try{ 
      hello = "hallo"; 

      //some other conditionals in real code 
      if(true) throw new Exception(); 

      initCorrect=true; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 
     if(initCorrect) 
      System.out.println(hello); 
    } 
} 

उत्तर

4

यह एक वर्ग प्रारंभकर्ता के लिए एक संकलन समय त्रुटि ("स्थिर ब्लॉक") एक जाँच अपवाद के साथ समाप्त करने के लिए है:

यहाँ एक उदाहरण आप शुरू कर सकते हैं के साथ है।

यदि कक्षा प्रारंभकर्ता अनचेक अपवाद को फेंक देता है, तो कक्षा को प्रारंभ करने का पहला प्रयास ExceptionInInitializeError बढ़ाएगा। कक्षा का उपयोग करने के बाद के किसी भी प्रयास से NoClassDefFoundError का कारण बन जाएगा। यदि आप वास्तव में अपवाद का उपयोग करना चाहते हैं, तो प्रारंभकर्ता में RuntimeException की तरह कुछ फेंक दें।

हालांकि, — प्रश्न में दिखाया गया दृष्टिकोण सही ढंग से प्रारंभ होने पर ध्वज स्थापित करता है — वास्तव में कई अनुप्रयोगों के लिए बेहतर हो सकता है। अधिक विशेष रूप से, मैं कहूंगा कि जब तक आप प्रारंभिक विफलता होने पर पूरा प्रोग्राम समाप्त नहीं करना चाहते हैं, तो ध्वज का उपयोग करें। कक्षा घोषणा से बस "फेंकता" खंड हटा दें, क्योंकि यह कानूनी वाक्यविन्यास नहीं है।

+0

क्या आप कर सकते हैं तो DirReader क्लास में प्रत्येक विधि एक अपवाद फेंक देती है अगर यह सही ढंग से प्रारंभ करने में विफल रही। –

3

क्लासेस अपवाद फेंक नहीं कर सकते। केवल विधियां अपवाद फेंक सकती हैं। आधार Exception कक्षा का उपयोग करने से बचें। IllegalStateException जैसे विशिष्ट अपवाद को फेंक दें या Exception का विस्तार करें और अपना स्वयं का बनाएं।

4

आपके पास एक स्थिर कोड ब्लॉक है जो एक अपवाद फेंकता है? यदि आपको वास्तव में RuntimeException फेंकने की ज़रूरत है - अन्यथा अपने तर्क को DirReader या Search Class से जुड़े विधि में ले जाएं और उन विधियों को उपयुक्त Exception फेंक दें।

public class test { 


    static { 
     try { 
      method1(); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(); 
     } 
    } 

    protected static void method1() throws InterruptedException {   
     Thread.sleep(1000);   
    } 


} 
+1

रनटाइम अपवाद को स्थिर प्रारंभिक ब्लॉक से नहीं फेंक दिया जा सकता है। आपको एक संकलन त्रुटि मिलेगी "प्रारंभकर्ता सामान्य रूप से पूरा नहीं होता है"। –

+0

ध्यान दें कि एक RuntimeException फेंकने से क्लासलोडर अपवाद फेंक देगा, और वर्ग लोडिंग अपेक्षाकृत अप्रत्याशित है (सिवाय इसके कि यह कक्षा का उपयोग करने से पहले होता है)। –

+0

@ जोनाथॉन मैंने बस एक कक्षा की कोशिश की जिसने एक स्थिर प्रारंभकर्ता में एक NullPointerException फेंक दिया। यह ठीक है, लेकिन java.lang.ExceptionInInitializer त्रुटि जब मैं इसे एक्सेस करने की कोशिश की। यह एक स्थिर प्रारंभिक –

24

throws कीवर्ड क्लास स्तर पर केवल विधि स्तर पर लागू नहीं किया जा सकता है।

+1

धन्यवाद धन्यवाद! कोई भी इसका उल्लेख नहीं करता है। – NoName

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