2010-06-23 50 views
1

我的應用程序寫了很多XML數據,並隨機下面這段代碼的最後一行:Random TransformerException,如何解決它?

// Prepare the DOM document for writing 
Source source = new DOMSource(node); 

// Prepare the output stream 
Result result = new StreamResult(stream); 

// Write the DOM document to the file 
Transformer xformer = TransformerFactory.newInstance().newTransformer(); 
xformer.transform(source, result); 

..throws ..

javax.xml.transform.TransformerException: java.io.IOException: Detected invalid substitute UTF-16: da89 4f ? 

(另外,我不知道爲什麼,但這個例外是唯一一個在我的語言,葡萄牙語中由vm引發的「Detectado substituto UTF-16inválido」,我把它翻譯成「Detected invalid UTF-16 substitute」)

另一個奇怪的事情是,我在我的文本中使用了UTF-8,而不是UTF-16已經檢查過了。而且,我相信如果UTF是問題所在,它不會導致隨機異常,因爲我得到的文本數量相同以轉換爲XML。

這個異常很難重現,因爲它不會總是出現,並且在將大量數據轉換爲XML時發生。

任何想法這裏發生了什麼?

+0

因此,如果您多次轉換同一文檔,它甚至不會重複發生? – 2010-06-23 21:46:36

+0

utf-16由java內部使用,char也是一個無符號16位int。 在你的來源的某個地方必須有一個角色沒有替代品。 此外,Java 1.4使用Unicode標準3.0版本,1.3使用2.1版本。這些版本通常不支持補充字符。由於1.5應該支持,所以使用版本4。 你在應用程序中生成源代碼還是來自外部文件? – Redlab 2010-06-23 22:14:20

+0

我每次開始創建應用程序時都遇到類似的問題(儘管出現不同的錯誤)。從控制檯(shell腳本),但從Eclipse啓動時沒有問題。 您是否正在開發應用程序。每次都一樣? – 2010-06-24 01:39:25

回答

0

我能想到的解決方法是讓程序在失敗時重新執行操作。由於它很難複製,它不應該連續發生兩次。

+0

當你失敗時,你是否記錄過所有時間?如果沒有,你應該設置一個記錄器來記錄它何時失敗,以及xml數據看起來像失敗。然後,您可以將其與工作區進行比較。 – xil3 2010-07-06 13:43:22

+0

@ xil3好點。對我來說,因爲我使用了相同的輸入,看起來沒有什麼區別,但是你的想法可能是一個好主意......在某個地方一定有什麼區別..無論如何,我沒有更多的工作在這個項目上..所以它採取這種解決方法作爲解決方案。 – 2010-07-07 13:53:41

0

從輸入流而不是讀者構造源,並讓XML解析器找出字符集。

+0

我不確定我是否理解,我更新了問題中的源代碼。如您所見,我使用DMOSource(Node)構建源代碼。如果您指的是文本源文件,則使用輸入流進行構建。 – 2010-06-24 13:12:48