Mam błąd podczas unmarshalingu XML do obiektu Java za pomocą JAXB:

java.lang.NullPointerException
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.parse(RuntimeBuiltinLeafInfoImpl.java:188)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$1.parse(RuntimeBuiltinLeafInfoImpl.java:186)
    at com.sun.xml.internal.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.parse(TransducedAccessor.java:230)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.LeafPropertyLoader.text(LeafPropertyLoader.java:50)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.text(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.text(InterningXmlVisitor.java:78)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.handleCharacters(StAXEventConnector.java:173)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(StAXEventConnector.java:127)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:392)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:368)

Jak mogę znaleźć przyczynę?

Więcej szczegółów:

Część xml, którą próbuję przeanalizować, to:

<member_resources>
                    <__field_location__>
                            <directive>
                                    sun-sat
                            </directive>
                            <file>
                                    null
                            </file>
                            <line>
                                    0
                            </line>
                    </__field_location__>
                    <sun-sat>
                            00:00-24:00 tester2
                    </sun-sat>
                    <__field_location__>
                            <directive>
                                    isLine
                            </directive>
                            <file>
                                    null
                            </file>
                            <line>
                                    0
                            </line>
                    </__field_location__>
                    <isLine>
                            true
                    </isLine>
            </member_resources>

Zatrzymując się na zdarzeniu, które to spowodowało, otrzymuję:

next event <__field_location__>
next event <directive>
next event sun-sat
next event <file>
next event null
1
oshai 27 luty 2012, 18:01

3 odpowiedzi

Najlepsza odpowiedź

Dodaj punkt przerwania wyjątku dla NullPointerException. Kiedy zostanie trafiony, zbadaj kilka poziomów wyżej w stosie wywołań, aby poznać stan zmiennych lokalnych, prawdopodobnie dostaniesz wskazówkę, co jest puste.

3
Florent Guillaume 27 luty 2012, 18:12

Dobrym podejściem jest użycie źródła JAXB(jego implementacji) oraz IDE do debugowania.

3
Sam 27 luty 2012, 18:12

Cóż, punktem wyjścia może być ustawienie punktu przerwania przy wywołaniu do unmarshalera i sprawdzenie dokładnie, które argumenty są przekazywane.

Pierwszą rzeczą, którą sprawdzę, jest to, że to, co przekazujesz, jest w rzeczywistości xml i że jest zarówno dobrze sformułowane, jak i prawidłowe.

1
fdierre 27 luty 2012, 18:05