我正在設計一個解決方案,其中包括一個C++庫和一些使用該庫通過JNI的Java應用程序。我應該從應用程序本機庫(通過JNI使用)拋出java.lang.OutOfMemoryError嗎?
C++庫大量分配本機內存。當分配失敗時,可以從C++代碼中檢測出來。如果未能分配,應該拋出一些可拋出的東西來向Java代碼報告。
的2個選擇被認爲是:
- 擲java.lang.OutOfMemoryError從我的C++代碼
- 添加mylibrary.MyLibraryOutOfMemoryError(擴展java.lang.RuntimeException或java.lang.Error的),和拋它
什麼是正確的選擇,爲什麼?
你必須**永遠不會拋出一個OOM錯誤,讓應用程序拋出它。此外,你**不能**處理錯誤,他們的目的是終止應用程序。 –
感謝您的回覆!您能否澄清一下(a)爲什麼OOM不應該從我的JNI代碼中拋出?例如在這裏他們甚至提供了一個方便的方法來拋出具體的OOM:http://stackoverflow.com/questions/230689/best-way-to-throw-exceptions-in-jni-code(b)你是什麼意思,讓你的應用程序丟它? – user2573701
從你所說的話來看,這樣的錯誤是不可恢復的;那麼你可能應該使用'RuntimeException'。本地代碼的分配失敗並不妨礙JVM的正常工作,但會阻止應用程序正常運行。如果JVM本身未能分配,反正你會很快看到一個'Error'。 – fge