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]