2011-09-09 15 views
9

मैंने अभी जावा सीखना शुरू कर दिया है, और केवल थोड़ी सी मात्रा को जानना है, हालांकि यह अभी भी एक साधारण कार्यक्रम है। यह एक शरारत कार्यक्रम है, लेकिन ज्यादातर परीक्षण करने के लिए अगर मैं एक जार फ़ाइल बना सकता हूं।रन करने का प्रयास करते समय NullPointerException .jar फ़ाइल

यहाँ कोड है:

import java.awt.*; 
import java.awt.event.*; 
import java.lang.*; 
import java.util.Random; 
public class randommouse { 
    public static void main(String[] args) { 
     for (int i=1; i<1000; i++) { 
      Random rand = new Random(); 
      int w = rand.nextInt(1024) + 1; 
      int h = rand.nextInt(768) + 1; 
      int t = rand.nextInt(2000) + 1; 
      try { 
       Robot r = new Robot(); 
       r.mouseMove(w,h); 
       Thread.sleep(t); 
      } catch (AWTException e) {} 
      catch (InterruptedException e) {} 
      catch (NullPointerException e) {} 
     } 
    } 
} 

मैं इस बचाने randommouse.java कहा जाता फाइल करने के लिए, तो इसे प्रयोग

javac randommouse.java 

यह काम करता है संकलन और यह

java randommouse 
का उपयोग कर जब मैं चलाने

यह ठीक काम करता है।

तो फिर मैं एक जार फ़ाइल बनाने का प्रयास करता हूं। मैं

jar cvf randommouse.jar randommouse.class 

और यह काम करता है। इसके बाद मैं जार फ़ाइल पर डबल क्लिक करता हूं और यह Java Exception त्रुटि के साथ आता है।
तो फिर मैं इसे cmd में

java -jar randommouse.jar 

साथ चलाने के लिए और इस त्रुटि

F:\Java>java -jar randommouse.jar 
Exception in thread "main" java.lang.NullPointerException 
     at sun.launcher.LauncherHelper.getMainClassFromJar(LauncherHelper.java:3 
99) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:463) 

F:\Java> 

मैं एक बहस में डाल करने की आवश्यकता है मिलता है, और जहां मुझे लगता है कि रखूँ यदि ऐसा है तो में और कैसे?


सैम

उत्तर

9

the JDK doc से:

आदेश में इस विकल्प को काम करने के लिए, जार फ़ाइल के प्रकट रूप

Main-Class: classname 
की एक पंक्ति शामिल होना चाहिए

यहां, कक्षा का नाम विचार सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) वाले वर्ग को ntifies करता है विधि जो आपके एप्लिकेशन के शुरुआती बिंदु के रूप में कार्य करती है। जार उपकरण संदर्भ पृष्ठ और जावा ट्यूटोरियल के जार ट्रेल को जार फ़ाइलों और जार-फ़ाइल मैनिफ़ेस्ट के साथ काम करने के बारे में जानकारी देखें।

जब आप इस विकल्प का उपयोग करते हैं, तो JAR फ़ाइल सभी उपयोगकर्ता कक्षाओं का स्रोत है, और अन्य उपयोगकर्ता श्रेणी पथ सेटिंग्स को अनदेखा कर दिया जाता है।

3

आप प्रवेश बिंदु

$> echo "Main-Class: randommouse" > Manifest 
$> jar cfm randommouse.jar Manifest randommouse.class 
1

अपने कोड है कि अपने वास्तविक समस्या से संबंधित नहीं हैं के साथ मुद्दों के एक जोड़े को स्थापित करने के लिए, लेकिन फिर भी महत्वपूर्ण हैं।

1) यह बयान अनावश्यक है:

import java.lang.*; 

डिफ़ॉल्ट रूप से, java.lang में हर वर्ग परोक्ष आयातित है। आपको इसे स्पष्ट रूप से करने की आवश्यकता नहीं है।

try { 
      // ... 
    } catch (AWTException e) { 
    } catch (InterruptedException e) { 
    } catch (NullPointerException e) { 
    } 

आप अपवादों कि प्रोग्रामिंग त्रुटियों के कारण सबसे अधिक संभावना कर रहे हैं पकड़ने रहे हैं, और सभी साक्ष्य कि वे कभी हुआ बर्बाद:

2) इस खतरनाक तरीके से बुरा कोड है। कम से कम, आपको किसी प्रकार का त्रुटि संदेश प्रिंट करना चाहिए ... और अपवाद स्टैकट्रैक जिसे आप इसका निदान कर सकते हैं।

इस विशेष संदर्भ (एक main विधि में) में, निम्न एक बेहतर तरीका है:

try { 
      // ... 
    } catch (Throwable e) { 
     System.err.println("An unexpected error has occurred:"); 
     e.printStacktrace(System.err); 
     System.exit(1); 
    } 
1

मैं कक्षा के स्रोत कोड पर एक नज़र लिया और मुख्य वर्ग प्राप्त करने की कोशिश करने लगता है गुणों की एक सूची से विशेषता, जो स्ट्रिंग्स हैं, और फिर पाए गए मुख्य श्रेणी विशेषता पर ट्रिम() विधि का आविष्कार कर रही हैं। जब मुख्य वर्ग को निर्दिष्ट नहीं किया जा रहा है, तो कोई मुख्य श्रेणी विशेषता नहीं है, जो खोज विधि को इंगित करने के लिए शून्य को वापस करने का कारण बनती है, और जब ट्रिम() पर इसका आह्वान किया जा रहा है, तो यह खोज विधि वापस लौटने के बाद से NullPointerException का कारण बन रहा है शून्य। इससे बचने के लिए, यह सुनिश्चित करें कि मुख्य वर्ग जार मालसूची में निर्दिष्ट किया जाता है:

[directory of class files]>jar -cvmf [name of manifest] MyApp.jar

और है कि आप प्रकट सही (अंत में लाइन ब्रेक के साथ) में लिखा है सुनिश्चित करें:

Main-Class: [name of main class] 
संबंधित मुद्दे