之前在写xml解析的demo的时候遇到一个编译error。
由于用SAX解析mxl的时候须有继承DefaultHandler,并实现它的一些API,code如下
package com.example.xmlparsedemo;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;//当前解析的元素标签
public List<Person> getPersons() {
return persons;
}
/*
* 接收文档的开始的通知。
*/
@Override public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
/*
* 接收字符数据的通知。
*/
@Override public void characters(char[] ch, int start, int length) throws SAXException {
if(tagName!=null){
String data = new String(ch, start, length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
/*
* 接收元素开始的通知。
* 参数意义如下:
* namespaceURI:元素的命名空间
* localName :元素的本地名称(不带前缀)
* qName :元素的限定名(带前缀)
* atts :元素的属性集合
*/
@Override public void startElement(String uri, String localName, String qName,Attributes attributes)throws SAXException {
if(localName.equals("person")){
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(attributes.getValue("id")));
}
this.tagName = localName;
}
/*
* 接收文档的结尾的通知。
* 参数意义如下:
* uri :元素的命名空间
* localName :元素的本地名称(不带前缀)
* name :元素的限定名(带前缀)
*
*/
@Override public void endElement(String uri, String localName, String name) throws SAXException {
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson = null;
}
this.tagName = null;
}
}
然后高亮的这一行一直报
the method startElement(String, String, String, Attributes) of type XMLContentHandler must override or implement a supertype method
eclipse给出的提议是 取得这一行啊之前的@Override. (PS.去掉之后,肯定可以编过,相当于重载了一个函数,变成了另一个函数了)
观察半天未发现明显语法错误。
仔细一想,这里应该跟原函数的参数一磨一样,莫非是参数不对? 于是找到DefaultHandler ,对比,乍一看,参数也一磨一样啊。
问题出在哪里呢?
@Override public void startElement(String uri, String localName, String qName,Attributes attributes)throws SAXException
原函数
莫非是参数类型不同?@Override public void startElement(String uri, String localName, String qName,Attributes attributes)throws SAXException
这里前三个参数的都String,应该一样,于是检查第四个参数类型,原函数的Attributes 对应的是 org.xml.sax.Attributes;
而反观这里,引入的类为
import java.util.jar.Attributes;
明显不对,问题就出在这里。
改过之后,ok。
那么在问一句,为何会出现这种问题呢??
原因是有的时候,我们直接copy别人的代码,然后在原有基础上开发,尤其是网上的demo,在eclipse里有个好处是,若发现某类型不能识别,则会自动提示开发者import相应的类,如下:
直接点import就会自动引入该类。但是这样同样会有隐患,
如果该类应在两个包里都有,比如这里的Attitudes,如下:
则这里需要多加注意,若没看清楚就import,则会造成后期很难查找的错误。