12

संभव डुप्लिकेट:
Is 1/0 a legal Java expression?शून्य निरंतर संकलित समय त्रुटि द्वारा जावा जावा को विभाजित क्यों नहीं किया जाता है?

इस कोड को क्यों संकलित करता है?

class Compiles { 
    public final static int A = 7/0; 
    public final static int B = 10*3; 

    public static void main(String[] args) {} 
} 

अगर मैं संकलित वर्ग फ़ाइल में एक बार देख ले, मैं देख सकता है कि बी 30 के लिए मूल्यांकन किया गया है, और कहा कि एक अभी भी 7/0 है।

जहां तक ​​मैं जेएसएल को एक अभिव्यक्ति समझता हूं जहां आप शून्य से विभाजित होते हैं, स्थिर नहीं है।

रेफरी:

एक संकलन समय निरंतर अभिव्यक्ति एक अभिव्यक्ति आदिम प्रकार का एक मूल्य दर्शाने

इसलिए से विभाजित है: JLS 15.28

मेरे ऊपर बयान इस लाइन की वजह से है शून्य का मूल्यांकन एक आदिम मूल्य पर नहीं किया जाता है।

जो मैं वास्तव में नहीं समझता कि संकलक इसे वैसे भी क्यों अनुमति देता है? बस स्पष्ट होने के लिए, "java.lang.ExceptionInInitializerError" के साथ क्रैश रनटाइम के ऊपर मेरा कोड

जैसा कि मुझे लगता है कि संकलक किसी स्थिर स्थिर चर को स्थिर के रूप में धमकाता है और इसे संकलित समय का मूल्यांकन करता है। इसका मतलब है कि संकलक ने पहले ही ए का मूल्यांकन करने की कोशिश की है, लेकिन चूंकि यह शून्य से एक प्रभाग था, इसलिए इसे जाने दें। कोई संकलन समय त्रुटि नहीं है। लेकिन यह बहुत ही विचित्र लगता है ... संकलक जानता है कि यह शून्य से विभाजित है और यह रनटाइम को क्रैश करेगा लेकिन फिर भी यह एक संकलन त्रुटि को ध्वजांकित नहीं करता है!

क्या कोई मुझे बता सकता है क्यों?

+1

शून्य उत्पादन संकलन-समय त्रुटियों द्वारा शून्य का विभाजन का कोई उदाहरण है? यदि आप सामान्य प्रक्रियात्मक कोड में शून्य से विभाजित होते हैं तो आपको रनटाइम में 'अंकगणितीय अपवाद' प्राप्त होगा, इसलिए मुझे संकलक के माध्यम से भी इस बारे में आश्चर्य की बात नहीं है। – BoltClock

उत्तर

6

java.lang.ExceptionInInitializerError फेंकने का एकमात्र सही व्यवहार है।

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

संकलित कोड में 7/0 डालने का एकमात्र सही विकल्प वास्तव में ExceptionInInitializerError स्पष्ट रूप से फेंकना होगा, लेकिन यह कितना उपयोगी है?

संकलक जानता है कि यह शून्य द्वारा विभाजन है और यह क्रम दुर्घटना होगा, लेकिन फिर भी यह झंडा एक संकलन त्रुटि है कि!

वास्तव में, मैं इससे सहमत नहीं होता ... होगा इस कार्यक्रम दुर्घटना?

class Compiles { 
    public final static int A = 7/0; 
    public final static int B = 10*3; 

    public static void main(String[] args) {} 

} 

public class Test { 

    // Application entry point. 
    public static void main(String[] args) { 
     try { 
      new Compiles(); 

      launchTheMissiles(); 

     } catch (ExceptionInInitializerError e) { 

      doUsefulStuff(); 

     } 
    } 
} 
+0

आपका प्रोग्राम क्रैश नहीं होगा। लेकिन मेरी इच्छा होगी। तो आप हमेशा कोशिश/पकड़ में नई वस्तुओं के प्रारंभिक रखेंगे ?? – laitinen

+1

हां। मैं हमेशा 'ExceptionInitializerError'-classesयों के इंस्टॉलेशन के बारे में कोशिश/पकड़ता हूं। ;- डी – aioobe

2

JLS 15.28 Constant Expression:

एक संकलन समय निरंतर अभिव्यक्ति एक अभिव्यक्ति है कि अचानक पूरा नहीं करता है और का उपयोग कर बना है आदिम प्रकार या एक स्ट्रिंग के एक मूल्य दर्शाने केवल निम्नलिखित है:

...

इसलिए 7/0 है संकलन-समय स्थिर नहीं है, क्योंकि इसका मूल्यांकन शून्य से विभाजन के कारण अचानक समाप्त हो जाता है। इसलिए, इसे नियमित रन-टाइम अभिव्यक्ति के रूप में माना जाता है, और रनटाइम में अपवाद फेंकता है।

+0

मैंने यही कहा था! मैं पूरी तरह सहमत हूँ। लेकिन मुझे यह अजीब लगता है कि यह संकलन त्रुटि के रूप में इसे ध्वजांकित नहीं करता है, क्योंकि संकलक ने पहले ही अभिव्यक्ति का मूल्यांकन किया है? – laitinen

+3

यदि आप सहमत हैं कि यह * संकलन-समय * स्थिर नहीं है, तो आपको आश्चर्यचकित नहीं होना चाहिए कि मूल्यांकन * रनटाइम * को स्थगित कर दिया गया है, और इसके परिणामस्वरूप अपवाद फेंक दिया गया है। – aioobe

+3

जो शायद मौजूदा जावैक व्यवहार को औचित्य देने के लिए एक पैच है (पिछड़े संगतता के कारण इसे बदल नहीं सकता है)। कल्पना बहुत अच्छी तरह से कह सकती है: "ब्ला ब्लाह, ** और यह एक संकलन समय त्रुटि है अगर अभिव्यक्ति की गणना नहीं होती **" – irreputable