2013-01-23 91 views
13

क्या इस ऑब्जेक्ट के कन्स्ट्रक्टर को अपवाद है, तो finalize() का उपयोग करके ऑब्जेक्ट को साफ़ किया गया है या नहीं, इस पर कोई विवरण है।एक कन्स्ट्रक्टर अपवाद फेंकने के बाद अंतिम रूप दिया जा सकता है?

जब इस विधि को बुलाया जाता है तो कुख्यात रूप से बीमार परिभाषित किया जाता है। मैनुअल के मुताबिक:

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

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize%28%29

मैं इस तरह से अंतिम रूप देने विधि को गति प्रदान करने में सक्षम नहीं किया गया है। क्या किसी को पता है कि क्या इसे बुलाया जाने वाला नहीं है या अगर यह कुछ मामलों में है तो कन्स्ट्रक्टर ऑब्जेक्ट को शुरू करने में विफल रहा है (एक अपवाद)।

मैं यह पूछता हूं क्योंकि मेरे पास एक वस्तु है जिसे दो बार साफ नहीं किया जाना चाहिए। मैं समझने की कोशिश कर रहा हूं कि अपवाद फेंकने से पहले साफ करना सुरक्षित है या अगर मुझे प्रभावी ढंग से छोड़ने और कुछ भी करने के लिए finalize() के लिए मार्कर छोड़ना होगा।

+3

+1 मुझे लगता है कि यह कुछ आप के रूप में विभिन्न JVMs अलग ढंग से व्यवहार हो सकता है के लिए जाँच करने की आवश्यकता होगी है। –

+0

'अंतिमकरण' का उपयोग करना बुरा है। –

+1

@ पीटर जेएलएस काफी विशिष्ट है, एक आधार [बेस] ऑब्जेक्ट सफलतापूर्वक पूरा हो जाने के बाद एक वस्तु अंतिम रूप देने योग्य है। –

उत्तर

10

मेरा परीक्षण से पता चलता है कि यह कर सकते हैं

public class Test1 { 

    Test1() { 
     throw new RuntimeException(); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     System.out.println("finalized"); 
    } 

    public static void main(String[] args) throws Exception { 
     try { 
      new Test1(); 
     } catch (RuntimeException e) { 
      e.printStackTrace(); 
     } 
     System.gc(); 
     Thread.sleep(1000); 
    } 
} 

प्रिंट

java.lang.RuntimeException 
    at test.Test1.<init>(Test1.java:13) 
    at test.Test1.main(Test1.java:24) 
finalized 

यह जावा HostSpot ग्राहक वीएम 1.7.0_03

+0

यह बहुत उपयोगी है! क्या आप अपने उत्तर में संपादित कर सकते हैं, जिस पर आपने JVM की कोशिश की और मैं इसे स्वीकार करूंगा। बहुत धन्यवाद! –

+0

ऐसा इसलिए है क्योंकि अंतर्निहित सुपर() ने अपवाद नहीं फेंक दिया। –

7

पर है JLS की धारा 12.6.1. Implementing Finalization के अनुसार:

एक ऑब्जेक्ट ओ है अंतिम रूप से तब तक नहीं जब तक कि इसके कन्स्ट्रक्टर ने ऑब्जेक्ट पर ऑब्जेक्ट के लिए कन्स्ट्रक्टर का आह्वान नहीं किया है और वह आमंत्रण सफलतापूर्वक पूरा हो गया है (यानी, अपवाद फेंकने के बिना)।

अपने निर्माता एक अपवाद के बाद वस्तु निर्माता पूरा करता है फेंकता है, तो अपनी वस्तु finalizable होना चाहिए, इसलिए finalize() अभी भी कहा जा सकता है।

अनुभाग 12.5. Creation of New Class Instances में ऑब्जेक्ट निर्माण के माध्यम से एक अच्छा उदाहरण है जो ऑब्जेक्ट कन्स्ट्रक्टर कहलाता है जब बिल्कुल दिखाता है।

+0

इसका मतलब कक्षा X X() {super();} में ऑब्जेक्ट को सुपर() कॉल अपवाद के बिना पूरा हो गया है। ऑब्जेक्ट क्लास में कचरा संग्रहण के लिए नए द्वारा आवंटित ढेर आवंटन को पंजीकृत करने के लिए गोंद कोड है। –

1

अधिक स्पष्ट रूप से प्रदर्शित करने के लिए:

public class Test1 { 

    public static class LifeBoat extends RuntimeException 
    { 
     private Test1 passenger; 
     public Test1 getPassenger(){return passenger;} 
     public LifeBoat(Test1 passenger){this.passenger=passenger;} 
    } 

    Test1() { 
     super(); //once this is finished, there is an Object to GC per JLS 12.6.1. 
     throw new LifeBoat(this); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     System.out.println("finalized"); 
    } 

    public static void main(String[] args) throws Exception { 
     try { 
      new Test1(); 
     } catch (LifeBoat e) { 
      Test1 obj; 
      obj=e.getPassenger(); 
      System.out.println(obj); 
     } 
     System.gc(); 
     Thread.sleep(1000); 
    } 
} 

प्रिंट

java.lang.RuntimeException 
    at test.Test1.<init>(Test1.java:13) 
    at test.Test1.main(Test1.java:24) 
[email protected] 
finalized 

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

  • कोई संबंधित समस्या नहीं^_^