2012-05-15 36 views
0

我有一個java程序,它是Jasper Reports的編譯器和執行程序,在我們的報告服務器上通過shell腳本調用。捕獲通過shell腳本調用的程序拋出的java NoClassDefFoundError

我剛剛修復了一個缺少依賴性引起的錯誤,但我花了一段時間才弄清楚什麼是錯誤的。通常,編譯過程所導致的問題被捕獲,記錄到日誌文件並通過電子郵件發送給相關人員。由於這是一個NoClassDefFoundError,它基本上退出了程序,並且從用戶的角度以沉默的方式失敗。

有沒有什麼辦法讓我捕捉像這樣的錯誤,以便他們也可以通過電子郵件發送出去?我有權修改正在執行的shell腳本。

+0

http://www.hiteshagrawal.com/java/sending-email-using-apache-log4j – oers

+0

我看着log4j的一點,但是從我的理解,我不認爲這工作。 NoClassDefFoundError無法在程序內部被捕獲,因爲它強制立即退出。 – Numeron

+1

在你的靜態主要方法中,你可以包含一個try ... catch(Throwable)...這將能夠處理noclassdeferror – oers

回答

0

通常,錯誤不會被應用程序代碼捕獲,並會被引發到JVM級別,並打印到STDERR。所以,你的方法來跟蹤這個錯誤是重定向錯誤輸出到file:

java -cp YourMain 1>stdout.log 2>stderr.log

你也可以把標準輸出和STDERR在一起:

java -cp YourMain 1>&2 2>wholelog.log

有一個關於多多參考流中的重定向。如果我的例子不滿足你,你可以在那裏看看。它取決於你的操作系統。

0

就可以捕獲錯誤即

try { 
     numericDefinition = new net.sf.cb2xml.def.BasicNumericDefinition(
        binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize 
      ); 
} catch (NoClassDefFoundError e) { 
     System.out.println("Class Not Found: " + e.getMessage()); 
} 

你必須非常小心你的編碼雖然,這是很容易得到的NoClassDefFoundError在類初始化時引發,而不是進入到試。 。catch塊。

的NoClassDefFoundError將拋出的第一次類refereneced這可能是什麼時候可以當一個類使用它使用它使用一類...它使用一個類引用的類,它的類的類不存在。

由於導入,在類初始化時,以下可能會因NoClassDefFoundError而失敗。

import net.sf.cb2xml.def.BasicNumericDefinition; // could cause the NoClassDefFoundError 

    ........... 
try { 
      numericDefinition = new BasicNumericDefinition(
         binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize 
       ); 
    } catch (NoClassDefFoundError e) { 
      System.out.println("Class Not Found: " + e.getMessage()); 
    } 
相關問題