我使用JAXB创建XML文件,如下所示。
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
陈述
如何处理此异常以便可以重新创建文件(删除旧文件)以防万一抛出此异常?
我没有显示创建XML元素的类(Fruit
和Fruits
),因为它们与此问题并不完全相关。
答案 0 :(得分:2)
SAXParseException
是一个已检查的异常,并未在方法unmarshal()
上声明,因此您无法捕获它。
您可以捕获另一个例外,即javax.xml.bind.UnmarshalException
。此异常扩展为javax.xml.bind.JAXBException
,因此您必须将catch
阻止放在JAXBException
之前。
在方法unmarshal()
的文档中,它表示如果发生验证错误或UnmarshalException
无法执行XML到Java绑定,则抛出Unmarshaller
。
注意:我在Unmarshaller
的实施中以及何时执行了验证
org.xml.sax.SAXException
发生,它包含在javax.xml.bind.UnmarshalException
。