2014-11-23 136 views
3

我正在嘗試執行java類加載。我在macos優勝美地上使用了日食(luna)和1.8.0_25。Try/Catch沒有捕捉異常

我正在使用下面的代碼來完成它。它正在工作,直到它到達一個具有依賴項的類,該依賴項不包含在我從中加載類的jar中。無論在環境上。

我對這個類不感興趣,所以,可以放心地忽略它。所以,我把它放在一個try/catch裏面,然後把它記錄下來。

但是,當發生異常時,執行被取消。

異常(總結)爲:

Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/runtime/internal/AroundClosure 

Caused by: java.lang.ClassNotFoundException: org.aspectj.runtime.internal.AroundClosure 

它上升時即內try/catch塊內的確切的行。

爲什麼? try/catch不應該只記錄它並繼續前進嗎?

URLClassLoader ucl = null; 
try { 
    URL url = Utils.getURIFromPath(jarFilePath).toURL(); 
    URL[] urls = new URL[] { url }; 
    ucl = new URLClassLoader(urls); 
    for (String tmp : classes) { 
     String clazz = tmp.substring(0, tmp.indexOf(".class")).replaceAll("/", "."); 
     try { 
      ucl.loadClass(clazz); 
     } catch (Exception e) { 
      LOGGER.error(e.getMessage(), e); 
     } 
    } 
} catch (MalformedURLException e) { 
    LOGGER.error(e.getMessage(), e); 
} finally { 
    if (ucl != null) { 
     try { 
      ucl.close(); 
     } catch (IOException e) { 
      LOGGER.error(e.getMessage(), e); 
     } 
    } 
} 
+1

這對堆棧跟蹤呢?引起:java.lang.ClassNotFoundException – committedandroider 2014-11-23 07:23:45

+2

修復你的類路徑。你似乎缺少了aspectj.jar。 – 2014-11-23 07:23:46

+1

這是真的嗎?該行以'Exception in thread'開始 – user3282276 2014-11-23 07:23:50

回答

6

NoClassDefFoundError錯誤,不是Exception,你應該永遠 嘗試catch錯誤,as stated here,抓住它不會幫你的。

檢查你的類路徑並修復它。

在某些情況下,你可能想catch錯誤,並相應地處理它,就像在評論中指出,也許「從未」強一點點

+2

從來沒有一個強大的詞。 try { array = new byte [bufsize]; }趕上(最終的OutOfMemoryError E){// ... } 似乎完全沒和我在一起。 – 2014-11-23 07:32:09

2

好吧那就試試這個:

catch (Throwable e) { 
LOGGER.error(e.getMessage(), e); 
} 

雖然使用上面的代碼將同時處理錯誤和異常爲你(無論是從Throwable延長),但它不是做正確的方式,只有在非常特殊的情況下做我們處理使用的try-catch錯誤,錯誤是一些我們需要檢查我們的代碼並解決它們。

+1

捕捉錯誤不會修復它。它只會隱藏它。 OP需要修復它的類路徑。捕捉Throwble是一個不好的習慣,不會解決任何問題。 – 2014-11-23 07:29:35

+1

@JB不是真正的男人,但這傢伙似乎只是抓住了錯誤,並沒有以正確的方式解決它,所以我發佈了這個解決方案,我想我應該編輯我的答案並告訴他。 – 2014-11-23 07:32:43

1

看來,類之一,您使用,可能是你想用loadClass加載類之一,擁有依賴上課從的AspectJ,但類加載器沒有找到AspectJ類。一個可能的解決方案是確保當您執行此操作時,AspectJ在您的類路徑上。

也可能是AspectJ已經在類路徑中。如果是這樣的話,那只是你的URLClassLoader不知道你的ClassPath。爲什麼程序不正義之舉是,你趕上Exception

ucl = new URLClassLoader(urls, getClass().getClassLoader()); 

原因:您可能需要與家長ClassLoader構建URLClassLoader到位,是這樣的。層次結構爲class Throwable,class Exception extends Throwableclass Error extends Throwable,因此catch (Exception e)不會捕獲Error。在這種特殊情況下,您可能需要使用catch(Exception | NoClassDefFoundError e)。通常,捕捉錯誤並不是一個好主意,但有時對於像NoClassDefFoundError,OutOfMemoryErrorStackOverflowError這樣的錯誤有合理的例外。