尝试运行.jar文件时出现NullPointerException

时间:2011-09-09 23:05:02

标签: java jar nullpointerexception executable

我刚开始学习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>

我是否需要提出一个参数,如果是这样,我将它放在哪里以及如何进行?

提前谢谢你 萨姆

5 个答案:

答案 0 :(得分:9)

来自the JDK doc

  

为了使此选项起作用,JAR文件的清单必须   包含表格

的一行
Main-Class: classname
  

这里,classname   标识具有public static void main的类(String [] args)   作为应用程序起点的方法。看到罐子   工具参考页面和Java教程的Jar跟踪   有关使用Jar文件和Jar文件清单的信息。

     

使用此选项时,JAR文件是所有用户的来源   类和其他用户类路径设置将被忽略。

答案 1 :(得分:3)

您必须设置入口点

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

答案 2 :(得分:2)

答案 3 :(得分:1)

您的代码存在一些与实际问题无关的问题,但很重要。

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); 
    }

答案 4 :(得分:1)

我看了一下类的源代码,它似乎试图从属性列表中获取主类属性,这些属性是字符串,然后在找到的主类属性上调用trim()方法。当没有指定主类时,没有主类属性,这会导致搜索方法返回null来表示,并且当调用trim()时,它会导致NullPointerException,因为搜索方法已经返回空值。为避免这种情况,请确保在jar清单中指定了主类:

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

并确保你已经写好了清单(最后有换行符):

Main-Class: [name of main class]