NullPointerException при попытке запустить файл .jar - PullRequest
9 голосов
/ 10 сентября 2011

Я только начал изучать 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>

Нужно ли вводить аргумент, и если да, то куда и как это вставить?

Заранее спасибо
Sam

Ответы [ 5 ]

9 голосов
/ 10 сентября 2011

С документ JDK :

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

Main-Class: classname

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

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

3 голосов
/ 10 сентября 2011

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

 $> echo "Main-Class: randommouse" > Manifest
 $> jar cfm randommouse.jar Manifest randommouse.class 
2 голосов
/ 10 сентября 2011

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

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

1 голос
/ 12 марта 2013

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

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

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

Main-Class: [name of main class]
1 голос
/ 10 сентября 2011

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

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

 import java.lang.*;

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

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

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

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

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

    try {  
            // ...
    } catch (Throwable e) {
        System.err.println("An unexpected error has occurred:");
        e.printStacktrace(System.err);
        System.exit(1); 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...