2013-04-30 1 views
2

XML 파일을 저장해야합니다. 나는 DOm을 사용하고 있으며 그 파일은 약 1,3 GB입니다.org.w3c.dom.ls.LSException 발생 원인 : java.lang.NegativeArraySizeException

Exception in thread "AWT-EventQueue-1" org.w3c.dom.ls.LSException 
at org.apache.xml.serializer.dom3.LSSerializerImpl.write(LSSerializerImpl.java:1087) 
at datos.XML_Seguridad.guardarDocumentoXML(XML_Seguridad.java:824) 
at datos.GUI$1ButtonListener.actionPerformed(GUI.java:2100) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.awt.EventQueue$3.run(EventQueue.java:686) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:702) 
at java.awt.EventQueue$4.run(EventQueue.java:700) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
Caused by: java.lang.NegativeArraySizeException 
at org.apache.xml.serializer.SerializerBase.characters(SerializerBase.java:958) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.dispatachChars(DOM3TreeWalker.java:381) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.serializeText(DOM3TreeWalker.java:1040) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.startNode(DOM3TreeWalker.java:429) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.traverse(DOM3TreeWalker.java:272) 
at org.apache.xml.serializer.dom3.DOM3SerializerImpl.serializeDOM3(DOM3SerializerImpl.java:111) 
at org.apache.xml.serializer.dom3.LSSerializerImpl.write(LSSerializerImpl.java:1069) 
... 37 more 
: 나는 아무 문제가 없지만, 나는 큰 파일을 저장하려고하면 내가 다음 예외가 작은 XML 파일을 저장하려고하면

public void guardarDocumentoXML() throws FileNotFoundException, IOException { 
    DOMImplementationLS ls = (DOMImplementationLS)documentoXML.getImplementation(); 
    LSSerializer ser = ls.createLSSerializer(); 
    LSOutput out = ls.createLSOutput(); 
    out.setEncoding("UTF-8"); 
    FileOutputStream output = new FileOutputStream(nombrearchivo); 
    try { 
     out.setByteStream(output); 
     ser.write(documentoXML, out); 
    } finally { 
     output.close(); 
    } 
} 

:이 일을 위해 나는 다음 코드를 사용

Xerces 2.11 라이브러리를 사용합니다. 도와 주시겠습니까? 감사합니다

+0

은 xerces에서 버그처럼 보입니다. 메일 링리스트에 연락하십시오. – rolfl

답변

2

Xerces2 Java 2.11.0serializer.jar에 달려 있습니다. 이 라이브러리에는 org.apache.xml.serializer.SerializerBase 클래스가 있습니다.

코드 m_charsBuff = new char\[length * 2 + 1\]; (줄 958)은 길이가 어떻게해서든지 (버그로 인해) 부정적인 경우에도 배열이 항상 양수로 생성된다는 것을 나타냅니다. NegativeArraySizeException이 발생했습니다.

응용 프로그램에서 음수 크기의 배열을 만들려고하면이 예외가 발생합니다.

length * 2 + 1 계산으로 인한 integer overflow을 제안합니다. DOM 파서에 제공된 XML 문서가 이므로 매우 크기 때문에이 문제가 발생한다고 생각합니다.

대신에 SAX 파서를 사용하는 것을 고려해 볼 수 있습니다 - 비교를 위해 What is the difference between SAX and DOM?을 참조하십시오.

관련 문제