NullPointerException при попытке запуска.файл jar

Я только начал изучать java и знаю только небольшое количество кода, однако это все еще простая программа. Это скорее программа шалости, но в основном просто проверить, могу ли я сделать файл 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. Я использую команда

jar cvf randommouse.jar randommouse.class 

и это работает. После этого я дважды щелкаю файл jar, и он выдает ошибку 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-->

5 ответов


С документ JDK:

чтобы эта опция работала, манифест файла JAR должен содержать строку вида

Main-Class: classname

здесь, classname определяет класс, имеющий открытый статический void main (String[] args) метод, который служит отправной точкой вашего приложения. Видишь банку? справочная страница инструмента и след Jar учебника Java для информация о работе с jar-файлами и Jar-файлом проявляется.

при использовании этой опции файл JAR является источником всех пользователей классы и другие параметры пути к классу пользователя игнорируются.


вы должны установить точку входа

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

вы указали точку входа в манифесте?

http://download.oracle.com/javase/tutorial/deployment/jar/appman.html


несколько проблем с вашим кодом, которые не связаны с вашей фактической проблемой, но тем не менее важны.

1) это утверждение не нужно:

 import java.lang.*;

по умолчанию каждый класс в java.lang is имплицитно импортировать. Вам не нужно делать это явно.

2) это опасно плохой код:

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

вы ловите исключения, которые, скорее всего, из-за ошибок программирования, и выбрасывая все доказательства что они когда-либо происходило. По крайней мере, вы должны распечатать какое-то сообщение об ошибке ... и исключение stacktrace к тому, что вы можете диагностировать его.

в этом конкретном контексте (в main метод), следующий лучший подход:

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

Я взглянул на исходный код класса, и, похоже, он пытается получить атрибут main class из списка атрибутов, которые являются строками, а затем вызывает метод trim() для найденного атрибута main class. Когда основной класс не указан, нет атрибута основного класса, который заставляет метод поиска возвращать null, чтобы указать so, и когда trim() вызывается на нем, это вызывает исключение NullPointerException, так как метод поиска вернул null. К избегайте этого, убедитесь, что основной класс указан в манифесте jar:

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

и убедитесь, что вы написали манифест справа (с разрывом строки в конце):

Main-Class: [name of main class]