2011-09-09 6 views
9

Ho appena iniziato a imparare java e conosco solo una piccola quantità di codice, tuttavia questo è ancora un programma semplice. È più di un programma scherzo, ma soprattutto solo per verificare se posso fare un file jar.NullPointerException durante il tentativo di eseguire file .jar

Ecco il codice:

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

risparmio che questo file chiamato randommouse.java, quindi compilarlo usando

javac randommouse.java 

Questo funziona e quando l'eseguo usando

java randommouse 

funziona anche.

Così quindi provo a creare un file jar. Io uso il comando

jar cvf randommouse.jar randommouse.class 

e funziona. Successivamente faccio doppio clic sul file jar e viene visualizzato un errore Java Exception.
Allora ho eseguito nel cmd con

java -jar randommouse.jar 

e ottenere questo errore

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> 

ho bisogno di mettere in un argomento, e se sì dove posso che mettere in e in che modo?

Grazie in anticipo
Sam

risposta

9

Da the JDK doc:

Affinché questa opzione funzioni, il manifesto del file JAR deve contenere una riga del modulo

Main-Class: classname 

Qui, nomenclatura ide nifica la classe con il metodo public static void main (String [] args) che funge da punto di partenza dell'applicazione. Vedere la pagina di riferimento dello strumento Jar e la traccia Jar di Java Tutorial per informazioni su su come lavorare con i file Jar e manifesti file Jar.

Quando si utilizza questa opzione, il file JAR è la fonte di tutte le classi utente e le altre impostazioni del percorso della classe utente vengono ignorate.

3

è necessario impostare il punto di ingresso

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

Un paio di problemi con il tuo codice che non sono legati al vostro problema reale, ma sono importanti comunque.

1) Questa dichiarazione non è necessaria:

import java.lang.*; 

Per impostazione predefinita, ogni classe in java.lang è implicitamente importato. Non è necessario farlo esplicitamente.

2) Questo è pericolosamente codice cattivo:

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

si stanno recuperando le eccezioni che hanno più probabilità a causa di errori di programmazione, e buttare via tutte le prove che mai accaduto. Per lo meno, dovresti stampare qualche tipo di messaggio di errore ... e lo stacktrace di eccezione a cui puoi diagnosticare.

In questo particolare contesto (in un metodo main), il seguente è un approccio migliore:

try { 
      // ... 
    } catch (Throwable e) { 
     System.err.println("An unexpected error has occurred:"); 
     e.printStacktrace(System.err); 
     System.exit(1); 
    } 
1

ho preso uno sguardo al codice sorgente della classe e sembra per cercare di ottenere la classe principale attributo da un elenco di attributi, che sono stringhe, e sta quindi richiamando il metodo trim() sull'attributo della classe principale trovato. Quando la classe principale non viene specificata, non esiste un attributo di classe principale, che fa sì che il metodo di ricerca restituisca null per indicarlo, e quando trim() viene invocato su di esso, sta causando NullPointerException poiché il metodo di ricerca è ritornato nullo. Per evitare questo, essere sicuri che la classe principale è specificato nel manifesto vaso:

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

Ed essere sicuri che avete scritto il diritto manifesta (con l'interruzione di riga alla fine):

Main-Class: [name of main class]