2011-09-09 29 views
9

Sadece java öğrenmeye başladım ve sadece az miktarda kod biliyorum, ancak bu hala basit bir program. Daha çok bir şaka programıdır, ancak çoğunlukla bir kavanoz dosyası yapabiliyorsam test etmek içindir. İşte NullPointerException çalıştırmaya çalışırken .jar dosyası

kodudur: randommouse.java denilen dosyası için bu tasarruf

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

, sonra bu işleri

javac randommouse.java 

kullanarak derlemek ve çalıştırmak zaman

java randommouse 
kullanarak

da iyi çalışıyor.

Böylece bir jar dosyası oluşturmaya çalışıyorum.

komutunu kullanıyorum ve çalışıyor. Daha sonra kavanoz dosyasını çift tıklıyorum ve Java Exception numaralı bir hata ile geliyor.
Ondan sonra

java -jar randommouse.jar 

ile cmd çalıştırmak ve

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> 

Ben bir tartışma koymak gerekir mi bu hatayı almaya ve eğer öyleyse bunu koyacağım nerede ve nasıl?


Sam

cevap

9

the JDK doc Gönderen: Bu seçenek çalışması için de

, JAR dosyası tezahür formu

Main-Class: classname 
bir çizgi içermelidir

Burada, sınıf adı ide Uygulamanızın başlangıç ​​noktası olarak hizmet veren genel statik geçersiz ana (String [] args) yöntemini içeren sınıfı belirtir. Kavanoz dosyaları ve Kavanoz dosyası bildirimleriyle çalışma hakkında araç başvuru sayfasına ve için Java Öğreticisinin Jar izine bakın.

Bu seçeneği kullandığınızda, JAR dosyası tüm kullanıcı sınıflarının kaynağıdır ve diğer kullanıcı sınıfı yol ayarları göz ardı edilir.

3

Sen giriş noktasının

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

gerçek soruna alakalı olmayan koduyla Birkaç sorunları ayarlamak zorunda, ama yine de önemlidir.

1) Bu ifade gereksizdir: Varsayılan olarak

import java.lang.*; 

, java.lang her sınıf ithal dolaylı olduğunu. Bunu açıkça yapmanız gerekmez. onlar hiç olmamış tüm delilleri atmadan olması nedeniyle, programlama hataları en muhtemel istisnaları yakalamak

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

ve :

2) Bu tehlikeli kötü kodudur. En azından, bir çeşit hata mesajı yazdırmanız gerekir ... ve bunu teşhis edebilmek için istisna yığını.

(a main yönteminde) bu özel bağlamda

aşağıdaki daha iyi bir yaklaşımdır:

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

Sınıfın kaynak koduna bir göz attık ve ana sınıf elde etmeye çalışmak gibi görünüyor öznitelikler listesinden bir öznitelik olan öznitelik, öznitelikler olarak bulunur ve sonra bulunan ana sınıf özniteliğinde trim() yöntemini çağırır. Ana sınıf belirtilmediğinde, arama yönteminin null olarak geri dönmesine neden olan ana sınıf özniteliği yoktur ve trim() üzerinde çağrıldığında, arama yöntemi döndüğünden bu yana NullPointerException neden olur. boş.

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

Ve (sonunda satır sonu ile) bildirim hakkı yazdım emin olun: Bunu önlemek için, ana sınıf kavanoz manifest'te belirtildiğinden emin olun

Main-Class: [name of main class] 
İlgili konular