2011-12-22 31 views
42

का उपयोग किये बिना कंसोल पर प्रिंटिंग संदेश मुझे इस प्रश्न को एक साक्षात्कार में पूछा गया था।मुख्य() विधि

main() विधि का उपयोग किए बिना कंसोल पर संदेश कैसे मुद्रित करें?

+3

आप कैसे शुरू होगा यदि आप एक मुख्य विधि के बिना आवेदन कर रहे हैं? – RoflcoptrException

+14

मैं इसे एक अच्छा साक्षात्कार प्रश्न के रूप में नहीं देख सकता। निश्चित रूप से आप आवेदक की समस्या सुलझाने की क्षमता का परीक्षण करना चाहते हैं, जावा के कम इस्तेमाल किए गए पहलुओं के ज्ञान नहीं? –

+14

@CallumRogers +1 ट्रिविया सबसे खराब प्रकार के प्रश्न हैं, जो कोई भी प्रश्न पूछता है वह मेरे मालिक होने के लायक नहीं है। –

उत्तर

62
public class Foo { 
    static { 
     System.out.println("Message"); 
     System.exit(0); 
    } 
} 

JVM से पहले System.exit(0) रास्ते कार्यक्रम के लिए main()

Ideone link

(नोट देखने के लिए शुरू होता है: भले ही वह JDK 7 के javac वह अपने java में नहीं चलाया जा सकता है के साथ संकलित है, क्योंकि यह main(String[]) विधि की अपेक्षा करता है।)

+1

@Roflcoptr '$ जावा फू 'किसी अन्य –

+1

@Roflcoptr' जावा-सीपी की तरह। मुख्य के साथ एक कार्यक्रम की तरह फू '। ;) –

+0

@Roflcoptr बस वर्ग को संकलित करें और 'जावा फू' चलाएं, यह कक्षा लोड करेगा, संदेश प्रिंट करेगा; और निष्पादन के लिए प्रवेश बिंदु खोजने से पहले हम बाहर निकलें। –

10

नामक फ़ाइल में

class Con { 
    String hi = "\n\nHello World\n\n"; 
} 

आपको बस विंडोज़ पर प्रोग्राम संकलित करना होगा। इसे नहीं चलाओ :-P

+2

यह काम करता है क्योंकि विंडोज़ पर 'CON' का विशेष अर्थ है, है ना? –

+3

यह भी कई अन्य सामानों को प्रिंट करता है। रास्ते में "कॉन" क्या है? यह फ़ाइल को "Con.java" नाम देने नहीं देता है। +1। –

+10

-1 प्लेटफ़ॉर्म-स्वतंत्र भाषा में किसी समस्या के लिए प्लेटफ़ॉर्म-विशिष्ट समाधान प्रदान करना गलत है। –

6
class MainMethodNot 
{ 
    static 
    { 
     System.out.println("Hello World"); 
     System.exit(0); 

    } 
} 

क्योंकि स्थिर प्रारंभकर्ता ब्लॉक निष्पादित होता है जब कक्षा पहली भरी हुई है, हम एक मुख्य विधि लेखन के बिना "नमस्ते दुनिया" प्रिंट कर सकते हैं। "System.exit()" कमांड का उपयोग करके निष्पादन रोक दिया गया है। इसलिए, हम "मुख्य विधि नहीं मिली" त्रुटि को रोकते हैं। यह काफी पेचीदा प्रश्न

12
public final class Main { 
    static { 
     System.out.println("Hello World"); 
     System.exit(0); 
    } 
} 

स्थिर ब्लॉक पहले जैसे ही कक्षा से पहले main(); विधि शुरू हो जाती है और इसलिए पहले main() कहा जाता है भरी हुई है निष्पादित किया जाता है है, System.exit(0) शुरू की वीएम शट डाउन।

System.exit विधि वर्तमान धागे के निष्पादन को रोकती है और अन्य सभी अपने ट्रैक में मृत होते हैं। जब System.exit कहा जाता है, वर्चुअल मशीन बंद करने से पहले दो क्लीनअप कार्य करता है।

सबसे पहले, यह Runtime.addShutdownHook के साथ पंजीकृत सभी शट डाउन हुक निष्पादित करता है। यह वीएम के बाहर संसाधनों को जारी करने के लिए उपयोगी है। व्यवहार के लिए शट डाउन हुक का उपयोग करें जो वीएम से बाहर निकलने से पहले होना चाहिए।

System.exit पर वीएम द्वारा किए गए दूसरे क्लीनअप कार्य को चिंताओं को अंतिम रूप दिया जाता है। यदि System.runFinalizersOnExit या इसके बुरे जुड़वां Runtime.runFinalizersOnExit कहा गया है, तो वीएम अंतिम रूप से अंतिम रूप देने वाले सभी ऑब्जेक्ट्स को पर अंतिम रूप से चलाता है। इन तरीकों को समय पहले एक लंबे और अच्छे कारण से हटा दिया गया था। किसी भी कारण से System.runFinalizersOnExit या Runtime.runFinalizersOnExit पर कभी भी कॉल न करें: वे जावा पुस्तकालयों में सबसे खतरनाक तरीकों में से हैं। इन विधियों को कॉल करने के परिणामस्वरूप अंतिम ऑब्जेक्ट्स लाइव ऑब्जेक्ट्स पर चल रहे हैं जबकि अन्य थ्रेड एक साथ में हेरफेर कर रहे हैं, जिसके परिणामस्वरूप अनियमित व्यवहार या डेडलॉक होता है।

संक्षेप में, System.exit तुरंत सभी प्रोग्राम धागे बंद कर देता है; यह कारण अंततः निष्पादित करने के लिए अवरुद्ध नहीं करता है, लेकिन यह VM को रोकने से पहले शट डाउन हुक चलाता है। वीएम नीचे बंद होने पर बाहरी संसाधनों को समाप्त करने के लिए शट डाउन हुक का उपयोग करें। System.halt पर कॉल करके शट डाउन हुक निष्पादित किए बिना वीएम को रोकना संभव है, लेकिन इस विधि का शायद ही कभी उपयोग किया जाता है।

public class MyClassLoader extends ClassLoader { 
    public MyClassLoader(ClassLoader other) { 
     super(other); 
     System.out.println("Hi there"); 
     System.exit(0); 
    } 
} 

फिर जावा कमांड चलाएँ::

6

आप एक कस्टम वर्ग लोडर है कि आपका संदेश प्रिंट निर्धारित कर सकते हैं

java -Djava.system.class.loader=MyClassLoader

(पैरामीटर के रूप में एक वर्ग को जोड़ने की जरूरत नहीं है)

1

हां, एक तरीका स्थिर ब्लॉक है लेकिन जेडीके के पिछले संस्करण में जेडीके 1.7 में नहीं है।

class Withoutmain{ 
static{ 
    System.out.println("Message: Your message can be print on console without main() method"); 
    System.exit(0); 
} 
} 

आउटपुट: संदेश: त्रुटि:: वर्ग ए 3 में नहीं मिला मुख्य विधि, के रूप में मुख्य विधि को परिभाषित कृपया आपका संदेश main() प्रणाली के बिना कंसोल पर प्रिंट (यदि नहीं JDK7)

आउटपुट हो सकता है : public static void (String [] args)

Reference

2

यह संभव हो गया था जब तक जावा 6 println() का उपयोग करने के लिए; बिना मुख्य()। जावा 7 से आगे, स्थिर ब्लॉक के साथ ऐसा करना संभव नहीं है। यह अभी भी मुख्य वर्ग में मुख्य विधि के लिए पूछेगा।

+0

हाँ मैंने कई जगहों पर देखा है, लेकिन मुझे स्पष्ट नहीं है कि jdk7 और बाद के संस्करण में क्यों निष्पादित नहीं किया जा रहा है, यदि आप इस पर अधिक जानकारी दे सकते हैं तो यह बहुत अच्छा होगा। –

2

आप भी स्थिर ब्लॉक का उपयोग नहीं करना चाहते हैं, यह तरीका

public class NoMain { 

    private static final int STATUS = getStatus(); 

    private static int getStatus() { 
     System.out.println("Hello World!!"); 
     System.exit(0); 
     return 0; 
    } 

} 

हालांकि, कृपया ध्यान दें कि यह जावा 6 संस्करण के लिए है निम्नलिखित किया जा सकता है। इसका not working in Java 7 जिसे जावा 8 में समर्थित माना जाता है। मैंने जेडीके 1.8.0_77-बी03 के साथ प्रयास किया, जो अभी भी

0

वास्तव में यह जावा 8 के नवीनतम अपडेट में काम नहीं करता है। आप इसे कॉल कर सकते हैं उनके अनुसार बग फिक्स, लेकिन जहां तक ​​मैं अपने वर्तमान ज्ञान पर विश्वास करता हूं इसे एक बग फिक्स के रूप में नहीं कहा जा सकता है क्योंकि यह जावा प्रोग्रामिंग में भी कुछ वैचारिक परिवर्तनों का कारण बनता है।

0

हां, आप मुख्य() के बिना कंसोल पर एक संदेश प्रिंट कर सकते हैं।

JUnit के साथ एक परीक्षण बनाएँ और यह निष्पादित करें:

@Test 
public printTest() { 
    System.out.println("myprint"); 
} 
संबंधित मुद्दे