2015-06-29 8 views
6

ऑनलाइन चुनौती को हल करते समय, मैंने जावा के निम्नलिखित व्यवहार को देखा जो मुझे थोड़ा अजीब मिला। मैं निम्नलिखित रूपरेखा के साथ एक कार्यक्रम संकलन के द्वारा शुरू कर दिया:जावा संकलन में त्रुटियों का अप्रत्याशित क्रम

  • मैं नहीं संभाला है अपवाद BufferedReader से फेंक दिया हो सकता है:

    import java.io.*; 
    
    class WeirdJava 
    { 
        public static void main (String[] args) 
        { 
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
         String input = br.readLine(); 
         HashMap<Integer, Integer> map = new HashMap<Integer,Integer>(); 
         System.out.println("Weird Java"); 
        } 
    } 
    

    सूचना उपरोक्त कार्यक्रम में, वहाँ दो त्रुटियाँ हैं।

  • मैंने मानक util लाइब्रेरी आयात नहीं की है जिसमें HashMap है।

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

import java.util.HashMap; 

जब मैं कार्यक्रम फिर से संकलन, इस बार संकलक त्रुटि दिखाता है

असूचित अपवाद IOException; पकड़े जाने या जा फेंक दिया

मेरे सवालों का घोषित किया जाना चाहिए:

  1. क्यों इस त्रुटि पिछले संकलन की कोशिश में फेंक दिया नहीं है?
  2. जिस क्रम में संकलन त्रुटि आती है वह प्राकृतिक प्रतीत नहीं होती है। इस दिनचर्या के दौरान खेलने वाले कंपाइलर डिज़ाइन सिद्धांत क्या हैं?

उत्तर

4

यह केवल ऑर्डर है जिसमें संकलक द्वारा स्रोत की जांच की जाती है। विशेष रूप से, कंपाइलर आयात के लिए जांच करता है और उन कोडों की जांच करने से पहले उन्हें हल करता है जो चेक अपवादों को बढ़ा सकते हैं।

आप -verbose साथ javac चलाते हैं, तो आप देखेंगे कि संकलक लोड आयातित वर्गों इस मामले BufferedReader और InputStreamReader में, है, तो यह Object और String तरह सार्वजनिक एपीआई वर्गों को लोड करता है:

[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/BufferedReader.class)]] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStreamReader.class)] 
]  
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]] 
[checking test.Test] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStream.class)]] 
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/Reader.class)]] 
Test.java:11: error: cannot find symbol 
    HashMap<Integer, Integer> map = new HashMap<Integer,Integer>(); 

देख कर this link में सिंहावलोकन, इस्तेमाल किया कक्षाओं में ही कहा जाता है पहले चरण संकलन का हिस्सा है लोड हो रहा है "पार्स और दर्ज करें" पर:

प्रत्येक पेड़ पास होना जरूरी है एड टू एन्टर, जो प्रतीकों में सामने आने वाली सभी परिभाषाओं के लिए प्रतीकों में प्रवेश करता है। इसे पेड़ के विश्लेषण से पहले किया जाना चाहिए जो उन प्रतीकों का संदर्भ दे सकता है। इस चरण से आउटपुट एक टू डू सूची है, जिसमें पेड़ होते हैं जिन्हें विश्लेषण करने की आवश्यकता होती है और कक्षा फाइलें उत्पन्न होती हैं।

+0

संकलक इस पास में अनिश्चित अपवाद के बारे में क्यों नहीं बताता है? – Bhoot

+0

@ बूट एकमात्र कारण मैं सोच सकता था कि यह अभी तक अपवाद अपवादों की जांच के चरण तक नहीं पहुंच पाया है। आयात के बिना प्रकारों का सामना करते समय यह तुरंत लौट आया। – manouti

+0

मैं इस कारण से असहमत नहीं हूं, लेकिन यह अप्राकृतिक लगता है।मैं इस विषय को संबोधित करने वाले किसी भी साहित्य की सराहना करूंगा (या इससे संबंधित कुछ भी)। – Bhoot

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