2011-09-09 6 views
9

Właśnie rozpocząłem naukę języka Java i znam tylko niewielką ilość kodu, jednak jest to wciąż prosty program. Jest to raczej program dowcipów, ale głównie po to, aby przetestować, czy mogę utworzyć plik jar.Wyjątek NullPointerException podczas próby uruchomienia pliku .jar

Oto kod:

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

zapisać to do pliku o nazwie randommouse.java, następnie skompilować go za pomocą

javac randommouse.java 

To działa i kiedy uruchomić go za pomocą

java randommouse 

działa również dobrze.

Tak więc próbuję utworzyć plik jar. Używam polecenia

i to działa. Następnie dwukrotnie klikam plik JAR i pojawia się błąd Java Exception.
Więc biegnę go w cmd z

java -jar randommouse.jar 

i dostać ten błąd

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> 

muszę umieścić w kłótnię, a jeśli tak, to gdzie mogę umieścić to w jaki sposób?

góry dziękuję
Sam

Odpowiedz

9

Od the JDK doc:

, aby ta opcja działała, manifest pliku JAR musi zawierać linię formie

Main-Class: classname 

Tutaj, nazwa klasy ide Określa klasę mającą public static void main (String [] args) metodę, która służy jako punkt wyjścia twojej aplikacji. Zobacz stronę odniesienia narzędzia Jar i ścieżkę Jar instrukcji Java Tutorial dla informacje o pracy z plikami jar i manifestami plików JAR.

Gdy używa się tej opcji, plik JAR jest źródłem wszystkich klas użytkowników , a inne ustawienia ścieżki klasy użytkownika są ignorowane.

3

Musisz ustawić punkt wejścia

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

kilka problemów z kodem, które nie są związane z faktycznym problemem, ale mimo to są ważne.

1) Stwierdzenie to jest niepotrzebne:

import java.lang.*; 

Domyślnie każda klasa w java.lang jest niejawnie importowane. Nie musisz tego robić jawnie.

2) Jest niebezpiecznie zły kod:

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

Jesteś łapanie wyjątków, które są najprawdopodobniej z powodu błędów programistycznych, a wyrzucać wszystkie dowody że zdarzyło. Przynajmniej powinieneś wydrukować jakiś komunikat o błędzie ... i wyjątek stacktrace do tego, że możesz go zdiagnozować.

W tym konkretnym kontekście (w metodzie main), po to lepsze podejście:

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

wziąłem przyjrzeć kodu źródłowego klasy i wydaje się, aby postarać się o główną klasę atrybut z listy atrybutów, które są łańcuchami, a następnie wywołuje metodę trim() w znalezionym atrybucie głównej klasy. Gdy główna klasa nie jest określona, ​​nie ma głównego atrybutu klasy, który powoduje, że metoda wyszukiwania zwraca wartość null, aby to wskazać, i gdy wywoływana jest metoda trim(), powoduje to wyjątek NullPointerException, ponieważ metoda wyszukiwania powróciła zero. Aby tego uniknąć, należy pamiętać, że głównym klasa jest określona w manifeście jar:

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

I upewnij się, że masz napisane manifestu prawo (z przerwą linii na końcu):

Main-Class: [name of main class]