2016-09-20 52 views
0

我知道類在Java代碼中首次使用時加載。我在運行java代碼期間傳遞一個類路徑。重複類ClassNotFoundException即使類已放入類路徑目錄中

流是:類>>主類>>新線程>>調用類構造函數>>線程運行代碼>>嘗試創建一個不存在的類的對象>> Catch ClassNotFoundException >>將不存在的類放入類路徑手動>>再次嘗試創建該非存在類的對象>>仍然拋出ClassNotFoundException

一旦發生ClassNotFoundException,我將所需的.class文件放在classpath目錄中,並且不想重新啓動我的程序。在發生ClassNotFoundException之後,當我從Main啓動新線程並按照流程運行時,它工作正常。但是,當我停留在同一個線程時,它不能正常工作。

該怎麼做我的程序在運行時重新獲取classpath類文件?

+0

提示:stackoverflow使用**標記**格式化文本。你不應該**在你的問題中加入HTML標籤。相反,請轉到幫助中心瞭解如何格式化您的輸入!另外:考慮在這裏放置一個**最小**可行的例子。你的問題聽起來很有趣,但我沒有時間自己寫出所需的代碼來驗證你的陳述! – GhostCat

+0

爲什麼?如果你可以在運行時訪問類,爲什麼他們不在類路徑中呢? – EJP

+0

@EJP因爲我需要從某個遠程位置接收所需的.class文件,而且我的程序也需要處理遠程接收的對象。 –

回答

1

每個線程都有自己的類加載器,可以使用Thread.currentThread().getContextClassLoader()訪問它。由於第一個線程在其類加載器中沒有該類,因此拋出了ClassNotFoundException。即使您手動將所需的.class文件複製到classpath目錄,該線程也不知道它。這是因爲除非重新啓動程序或創建新線程,否則不會重載類。

你提到:

捕捉ClassNotFoundException異常>>把不存在的類在classpath中手動

你已經抓住了ClassNotFoundException的之後,你將當前線程睡眠,直到您複製缺少的.class文件?你是怎麼處理的?

+0

確切的。你的回答完美地解釋了原因。現在請建議我如何解決這個問題。我有while循環接收遠程序列化對象並對該對象執行一些工作並返回。當發生異常時,它將錯誤對象發送給遠程,並將缺少的.class文件放到classpath中,並通過繼續while循環,再次接收相同的遠程序列化對象,但這次它不應該拋出異常,但它確實會拋出異常。 –