尝试运行.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]