2016-01-03 9 views
22

आप इस प्रकार का कार्यक्रम है, तो:जावा में एक HTTP यूआरएल क्यों संकलित करता है?

public class ABC 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("1"); 
     http://example.com 
     System.out.println("2"); 
    } 
} 

नोट यूआरएल http://example.com दो उत्पादन बयानों के बीच में लिखा है।

कार्यक्रम बिना किसी त्रुटि के संकलित क्यों करता है?

+1

मैं इस बारे में सोच रहा था, जब एक बार लाइनों के बीच का लिंक लिखा था और '//' के बारे में भूल गया था, लेबल मजाकिया हैं :) – coolguy

+0

मुझे जावा 1.0 से यह चाल याद है, मैंने विश्वविद्यालय में सीखा, दुर्भाग्य से मेरे पास केवल भारी 1.0 के बजाय 1.1 के लिए "कोर जावा" को धराशायी: पी डुप्लीज़ के लिए देखा, लेकिन कोई भी नहीं मिला। –

+0

यह सुनिश्चित नहीं है कि इसे डुप्लिकेट क्यों चिह्नित किया गया था। प्रश्न ** जावा लेबल उपयोग ** का एक अलग सवाल है, और इसके उत्तर उस प्रश्न से संबंधित हैं। इसके अलावा, इसे एक प्रश्न का डुप्लिकेट चिह्नित किया गया था जो स्वयं एक डुप्लिकेट है! :/ – Hackerdarshi

उत्तर

36

त्रुटि के बिना प्रोग्राम संकलित करने का कारण यह है कि प्रोग्राम http: को लेबल में अनुमति देता है, जिसे जावा में अनुमति है, और ज्यादातर लूप के साथ प्रयोग किया जाता है।
दूसरा भाग, यानी //example.com// के कारण एक टिप्पणी है, और इसलिए संकलक द्वारा अनदेखा किया जाता है।

इसलिए यह ठीक से संकलित करता है।

+4

अभी भी एक बुरा फॉर्म, उल्लेख किया जाना चाहिए। –

+4

क्या इस तरह के "मैं एक प्रश्न पूछता हूं और तुरंत जवाब देता हूं" ऐसा करने की अनुमति है? ओ ओह .. ओपी ने इस साइट पर अपने कुछ प्रश्नों में यह किया ... – Flocke

+1

@ फ़ॉक हाँ, यह इस साइट पर ठीक है :) – coolguy

18

जैसा कि यह this उत्तर में वर्णित है, यह कोड संकलित करता है क्योंकि जावा संकलक सोचता है कि http: एक लेबल है और // के बाद सबकुछ एक टिप्पणी है।

इसके अलावा, इस संकलन नहीं:

System.out.println("1"); 
http://example.com 
int i = 1; 

और यह कार्य नहीं करेंगे:

System.out.println("1"); 
http://example.com 
Date date = new Date(); 

लेकिन यह होगा:

System.out.println("1"); 
int i; 
http://example.com 
i = 1; 

और यह होगा:

int i = 0; 
System.out.println("1"); 
http://example.com 
i = i + 1; 

और यह:

int i = 0; 
System.out.println("1"); 
http://example.com 
i++; 

तो आप लेबल के बाद चर की घोषणा नहीं कर सकते हैं। इसके अलावा इंटेलिज आईडीईए इस तरह के कोड के साथ कुछ चेतावनियां दिखाता है।

+0

कृपया या तो एक पूर्ण उत्तर लिखें या मौजूदा उत्तर में उदाहरणों को एकीकृत करें। –

+1

@coolguy आपको अपना जवाब नहीं हटाना चाहिए। यह कुछ अच्छे उदाहरण प्रदान करता है, यही कारण है कि यह ऊपर उठाया गया है। :) – Hackerdarshi

+0

नोट करें कि आप http://stackoverflow.com/a/5058025/1074998 और http://stackoverflow.com/a/8145704/1074998 का ​​उल्लेख कर सकते हैं कि घोषणा क्यों नहीं है। –

1

लगता है कि कंपाइलर लेबल के बाद केवल कथन स्वीकार करते हैं। इसलिए आरक्षित कीवर्ड और कक्षा के नामों की अनुमति नहीं है। लेकिन इस नियम के लिए अपवाद है।

interface PrintSome { 
    default void print() { 
     System.out.println("I`m printing some!"); 
    } 
} 

और उसके बाद:

http://www.example.com 
new PrintSome(){}.print(); 

संकलन है।

+0

यह केवल अज्ञात कक्षाओं के साथ काम करता है? क्या आप इसे स्पष्ट कर सकते हैं? – coolguy

+1

इस बारे में कुछ भी असामान्य नहीं है। आप कथन लेबल कर सकते हैं, लेकिन आप घोषणाओं को लेबल नहीं कर सकते हैं। आपके उदाहरण में आपके पास एक घोषणा नहीं है। –

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