Обработка исключения org.xml.sax.SAXParseException при чтении и записи XML-файла с использованием JAXB

#java #xml #jaxb #java-7

#java #xml #джаксб #java-7

Вопрос:

Я создаю XML-файл с использованием JAXB следующим образом.

 public final class Main
{
    private File file;
    private transient JAXBContext jaxb;
    List<Fruit>fruits;

    private void test()
    {
        try {
            jaxb=JAXBContext.newInstance(Fruits.class);
            file=new File(System.getenv("UPLOAD_LOCATION") "\xml_files\fruits.xml");

            Marshaller marshaller = jaxb.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);

            if(!file.exists()) {
                file.createNewFile();
                marshaller.marshal(new Fruits(new ArrayList<Fruit>()), file);
            }
            else {
                fruits=((Fruits) jaxb.createUnmarshaller().unmarshal(file)).getList();
            }

            for(Fruit fruit:fruits) {
                System.out.println(fruit.getId() " : " fruit.getName() " : " fruit.getPrice());
            }

        } catch (JAXBException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }/*catch (SAXParseException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }*/
    }

    public static void main(String... args) {
        new Main().test();
    }
}
 

Код, добавляющий объекты, исключается. Однако он генерирует XML-файл примерно следующим образом.

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<fruits>
    <fruit id="1">
        <name>Mango</name>
        <price>100</price>
    </fruit>
    <fruit id="2">
        <name>Banana</name>
        <price>50</price>
    </fruit>
    <fruit id="3">
        <name>Pineapple</name>
        <price>80</price>
    </fruit>
</fruits>
 

Если этот XML-файл признан недействительным по определенным причинам, например, он может быть изменен извне.

Если этот файл содержит некоторый формат XML с множественным форматом, он выдает org.xml.sax.SAXParseException . Если это исключение выдается, я хочу воссоздать этот файл. В противном случае исключение будет генерироваться постоянно, если содержимое XML не будет изменено и реструктурировано вручную. Чтобы это было так, это исключение должно быть перехвачено.

Компилятор отказывается перехватывать это исключение. Если предпринята попытка создания дополнительного catch блока для этого исключения, как показано в сокращенном коде, он жалуется,

исключение org.xml.sax.SAXParseException никогда не выдается в теле соответствующего try оператора

Как обработать это исключение, чтобы файл можно было воссоздать (удалив старый) в случае возникновения этого исключения?

Я не показываю классы ( Fruit и Fruits ), которые создают XML-элементы, поскольку они не совсем связаны с этим вопросом.

Ответ №1:

SAXParseException является проверяемым исключением и не объявлено в методе unmarshal() , поэтому нормально, что вы не можете его перехватить.

Существует еще одно исключение, которое вы могли бы поймать, а именно javax.xml.bind.UnmarshalException . это исключение расширяется javax.xml.bind.JAXBException , поэтому вам нужно поместить свой catch блок раньше JAXBException .

В документации к методу unmarshal() говорится, что UnmarshalException он выдается, если возникает ошибка проверки или Unmarshaller не удается выполнить привязку XML к Java.

Примечание: я проверил реализацию Unmarshaller и когда
org.xml.sax.SAXException происходит, он завернут в javax.xml.bind.UnmarshalException .