2012-09-19 62 views
0


我今天做了一個奇怪的問題......我會做,因爲它「值得一萬字」一個簡單的例子:d無法打開Java應用程序運行時如可執行的JAR

public class Application() { 
    public static void main(String[] args) { 
     try { 
      A a = new A(); // this may throw exceptions 
          // (which will cause an ExceptionInInitializerError) 
     } catch (Throwable t) { 
      JOptionPane.showMessageDialog(null, "Oooops!"); 
      System.exit(1); 
     } 
    } 
} 

因爲它是一個Swing GUI的一個獨立的應用程序,我的目標是在任何問題的情況下給一個消息給用戶(在這種情況下,在啓動時)......以上代碼工作在Eclipse IDE,但是當我出口該項目作爲可執行jar通過雙擊它,好吧,它只是不會打開。

所以我嘗試用cmd與java -jar application.jar執行它,並在shell中打印出有ExceptionInInitializerError

爲什麼不抓住這個錯誤嗎?
即使我指定catch (ExceptionInInitializerError e),它也不起作用。

編輯: 更深入的調試後,我發現,當兩個特定的異常發生,後者發生在前者的catch塊纔會出現這種問題。 我通過更改我在啓動時執行的一些檢查的順序來更正了此錯誤。

問題BTW應該不會發生,因爲它最初由JDBC驅動程序類名的volountary錯誤在靜態塊加載。

嗯,至少它讓我清楚地理解了爲什麼構造函數和靜態初始化塊不應該拋出異常:在拋出異常的類被許多類使用的情況下,它幾乎不可能調試,因爲它可能會變成很難發現課程何時加載。

+3

什麼是堆棧跟蹤? – zeller

+0

請確保類路徑中的類「A」 – mishadoff

+0

您是否擁有主類的正確清單文件?這是否幫助:http://stackoverflow.com/questions/6348258/jar-file-failing-to-execute-with-nullpointerexception-when-it-runs-fine-unpacked – 18bytes

回答

0

我能想到的三種可能的解釋爲ExceptionInInitializerError不陷入你的例子:

  • 它可以被JOptionPane.showMessageDialog(null, "Oooops!");

  • main被調用之前它可能會被拋出異常。

  • 它可以在不同的堆棧被拋出。

事實上,我認爲:第二個是最有可能的,因爲當一個類的初始化過程中一些未經檢查的異常被拋出(而不是抓)ExceptionInInitializerError被拋出。在輸入try區塊之前,可能會發生這種情況。

+0

我認爲這肯定不會*發生,因爲我沒有用'main()'方法在類中聲明任何東西,try/catch塊外面什麼都沒有。如果我用Eclipse運行一切都沒問題,一切都會被捕獲(在我的真實代碼中,我也檢查了其他異常)。 – tmh

相關問題