Java 7 到 Java 8 的升級可能偶爾會導致在讀取操作期間指示流關閉的異常。這是由於終結執行緒在持有流的物件上呼叫 Finalize() 並隨後將其關閉所致。
考慮到提供的程式碼,由 MIMEBodyPart 擴展的 HTTPMessage 中的 Finalize() 方法會呼叫 close() ,該方法由 MIMEBodyPart 擴展。關閉關聯的流。在執行 MIMEWriter.writePart() 期間,IOUtils.copy 從輸入流讀取區塊直至耗盡。
在 IOUtils.copy 執行階段執行 HTTPMessage.finalize() 時會出現問題,導致 Stream 關閉例外。雖然可以從堆疊幀存取 MIMEBodyPart 對象,但 JVM 會呼叫 Finalize()。這種行為令人困惑。
潛在解釋
即使引用本地堆疊變數和活動方法調用中的對象,如果被認為“無法存取”,也可以最終確定對象並進行垃圾收集」。對於無法存取的對象,後續程式碼不會與其引用進行互動。
在這種特定情況下,MimeBodyPart物件可以儲存在本地變數中。可能會認為它無法訪問,從而觸發其終結。了堆疊。物件的引用,可以觀察到終結。下有可能最終確定可存取的物件。
以上是為什麼強可達 Java 物件在 Java 8 中被終結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!