Исключение нулевого указателя Java XML

#java #xml #file #jaxb #unmarshalling

#java #xml #файл #jaxb #отмена сопоставления

Вопрос:

У меня очень большой XML-файл (около 29 ГБ), где каждая вторая альтернативная строка представляет собой XML с примерно 500 атрибутами. Я последовательно считываю файл и отправляю строку в unmarshaller, который создает из него объект.

Через некоторое время я получил следующее исключение.

 java.lang.NullPointerException  at com.sun.xml.internal.stream.Entity$ScannedEntity.close(Entity.java:439)
 

Следующее принимает строку и удаляет ее.

 sCurrentLine = br.readLine();
idDetails = IDUnmarshal.IDUnmarshall(sCurrentLine);
idObjectList.add(idDetails);
 

Это полная трассировка стека

      java.lang.NullPointerException at com.sun.xml.internal.stream.Entity$ScannedEntity.close(Entity.java:439)
     at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1404)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)

            at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
            at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
            at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
            at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
            at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
            at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211)
            at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
            at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
            at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
 

Комментарии:

1. Вы используете синтаксический анализатор SAX или DOM?

2. Я думаю, что я использовал значение по умолчанию : JAXBContext jid = JAXBContext.newInstance("package_name"); Unmarshaller u = jid.createUnmarshaller(); InputStream i = new ByteArrayInputStream(xmlstring.getBytes("UTF-8")); idObject = (idType)unmarshaller.unmarshal(i);

3. Я думаю, что он использует синтаксический анализатор SAX, потому что, если XML неверен, я получаю org.xml.sax.SAXParseException

Ответ №1:

Рассматривали ли вы, что вы, возможно, читаете строку, которая не существует с вашим .readLine(); вызовом и, таким образом, сохраняете в нем нулевое значение, которое используется методом TDUnmarshall и выдает ошибку?

Комментарии:

1. да.. У меня есть проверка нулевого условия перед моим фрагментом кода.. Я не опубликовал его, который all..my код работал для файлов размером 350 МБ .. 500 МБ .. это первый раз, когда я пытаюсь использовать очень большой файл..