2010-03-22 35 views
3

我想調用另一個JAR的主函數。現在,這個主函數被包含在一個try和catch塊中。調用Java主函數

但是,當主調用返回一個「NullPointerException」時,程序只是崩潰而不是捕獲它。

因此,例如

try { 
    somelibary.main() 
} 
catch (Exception e) { 
    System.out.println("Exception Caught"); 
} 

從主此代碼dosent捕獲的NullPointerException()。 有誰知道y的原因?

+0

它應該。顯示代碼:) – extraneon 2010-03-22 16:09:16

+0

是不是這個問題完全通過回答http://stackoverflow.com/questions/776765/why-is-my-nullpointerexception-not-being-caught-in-my-catch-block? – Riduidel 2010-03-22 16:10:08

+0

是否正如您在導入中看到的那樣捕獲java.lang.Exception的異常的完整包?你是否肯定NPE被拋出?也許粘貼你的堆棧跟蹤。 – 2010-03-22 16:10:29

回答

5

你的代碼,如圖所示,肯定會遇到somelibrary.main()引發的NullPointerException。如果應用程序由於NullPointerException而停止,那麼某些點上的某些庫可能會捕獲異常,並轉儲堆棧跟蹤並調用system.exit()

在這種情況下,問題不在於如何捕獲NPE,但如何防止System.exit()實際退出。

而且,該問題的答案當然可以在StackOverflow找到,right here。只需在調用someLibrary之前安裝SecurityManager,然後重置SecurityManager。

5

這有可能是其他的主要功能是做自己的錯誤處理,點菜

public static void main(String[] args) { 
    try { 
     .... 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(0); 
    } 
} 

如果這就是另一個主要功能是幹什麼的,那麼你將無法趕上它的例外。你有這個主要功能的代碼嗎?

+0

不,它是我正在使用的JAR。 是否有任何解決方法,以便我可以捕獲由main()拋出的異常? – Sunny 2010-03-22 16:15:54

+0

@Sunny不存在主要拋出的異常,否則你會發現它。正如威爾所說,可以這樣說,這個例外被捕獲並且一個退出被稱爲,但那是不同的。 – extraneon 2010-03-22 16:21:51

0

隨着您顯示的代碼,您還將捕獲NullPointerException。但執行將在catch-block之後繼續。所以在這種情況下停止執行somelibary.main()。如果你的main()不包含更多的代碼,程序將在捕獲異常後結束。這可能發生。您可以發佈您的主要完整代碼,以驗證這一點。

此外:你想知道如何繼續執行程序。但在這種情況下,通過拋出異常來停止somelibrary.main()。 main-class中的唯一選項是循環,重新執行somelibrary.main()。另一種可能性是在更高級別(主要輸入循環)捕獲異常,您可以忽略問題並繼續執行代碼。正如你所說,你執行另一個罐子主,我懷疑你不能改變另一個罐子的代碼。所以,你只剩下再次執行其他主:

boolean ended = false; 
while (!ended) 
{ 
    try { 
     somelibary.main() 
     ended = true; 
    } 
    catch (Exception e) { 
     System.out.println("Exception Caught"); 
    } 
} 

此代碼將重新啓動其他主要的異常,但如果結束的另一主要目的正常。

0

也許你可以在另一個使用Runtime.exec的進程中執行main方法,然後從out/err流中捕獲結果或錯誤。