尝试运行.jar文件时出现NullPointerException
我刚开始学习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>
我是否需要提出一个论点,如果是这样的话我该把它放在哪里以及如何?
先谢谢你
山姆
从JDK doc :
为了使此选项起作用,JAR文件的清单必须包含表单的一行
Main-Class: classname
这里,classname标识具有public static void main(String [] args)方法的类,该方法充当应用程序的起点。 有关使用Jar文件和Jar文件清单的信息,请参阅Jar工具参考页面和Java Tutorial的Jar跟踪。
使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。
您必须设置入口点
$> echo "Main-Class: randommouse" > Manifest $> jar cfm randommouse.jar Manifest randommouse.class
您的代码存在的几个问题与您的实际问题无关,但仍然很重要。
1)此声明是不必要的:
import java.lang.*;
默认情况下, java.lang
每个类都是隐式导入的。 您不需要明确地执行此操作。
2)这是一个非常糟糕的代码:
try { // ... } catch (AWTException e) { } catch (InterruptedException e) { } catch (NullPointerException e) { }
您正在捕获很可能由编程错误引起的exception,并丢弃所有发生过的证据 。 至少,您应该打印出某种错误消息……以及可以诊断它的exception堆栈跟踪。
在这个特定的上下文中(在main
方法中),以下是更好的方法:
try { // ... } catch (Throwable e) { System.err.println("An unexpected error has occurred:"); e.printStacktrace(System.err); System.exit(1); }
我看了一下类的源代码,它似乎试图从一个属性列表中获取主类属性,这些属性是字符串,然后在找到的主类属性上调用trim()方法。 当没有指定主类时,没有主类属性,这会导致搜索方法返回null来表示,并且当调用trim()时,它会导致NullPointerException,因为搜索方法已经返回空值。 要避免这种情况,请确保在jar清单中指定了主类:
[directory of class files]>jar -cvmf [name of manifest] MyApp.jar
并确保你已经写好了清单(最后有换行符):
Main-Class: [name of main class]