NullPointerException异常的Java的SAXParser(NullPointerE

2019-10-18 18:25发布

我解析使用SAX的XML。 我写的代码像TJE互联网的例子,我有seen.I得到URL,然后我解析了。 这里是我的代码。

public class Urunler implements Serializable {

private String title;
private String description;

public Urunler(String title, String description) {
    this.title = title;
    this.description = description;
}

public Urunler() {
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String cevir() {
          StringBuffer sb = new StringBuffer();
          sb.append("Title:" + getTitle());
          sb.append(", ");
          sb.append("Description:" + getDescription());
          sb.append(".");
          return sb.toString();
   }
}

然后,我已经写了解析的处理程序。 这是下面;

public class UrunlerHandler extends DefaultHandler{

private Urunler urunler;
private String temp;
private ArrayList<Urunler> urunlerList= new ArrayList<Urunler>();

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    temp = "";

    if(qName.equalsIgnoreCase("item")){  
        urunler = new Urunler();
    }

}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    temp = new String(ch,start,length);
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if(qName.equalsIgnoreCase("item")){
        urunlerList.add(urunler);
    }else if(qName.equalsIgnoreCase("title")){
        urunler.setTitle(temp);
    }else if(qName.equalsIgnoreCase("description")) {
        urunler.setDescription(temp);
    }

}


public void readList(){
    Iterator<Urunler> it = urunlerList.iterator();
    while (it.hasNext()) {
        System.out.println(it.next().cevir());
    }
}

然后我在这样的主要方法已使用;

     try {
        SAXParserFactory spfac = SAXParserFactory.newInstance();

        SAXParser sp = spfac.newSAXParser();

        UrunlerHandler handler = new UrunlerHandler();

        URL geoLocationDetailXMLURL = new URL(url);
        URLConnection geoLocationDetailXMLURLConnection = geoLocationDetailXMLURL.openConnection();
        BufferedReader geoLeocationDetails = new BufferedReader(new InputStreamReader(geoLocationDetailXMLURLConnection.getInputStream(), "UTF-8"));
        InputSource inputSource = new InputSource(geoLeocationDetails);
        sp.parse(inputSource, handler);
        handler.readList();

    } catch (Exception e) {
        e.printStackTrace();
    }

我看不清连接错误。 但它给错误NullPointerException异常。 这里是URL =“ http://www.gold.com.tr/cok-sa​​tanlar-rss/54109/0 ”

Answer 1:

您使用的是学会从SAX是坏榜样的来源,看到了Oracle教程 ,如果你想知道如何做这正确的方式(或见注释接受的答案你前面的问题 ,这也道出了一个良好教程)。

但SAX可能是你想要的这里矫枉过正,XPath的可能是一个简单的解决方案。 更声明,而且具有更少的缺陷。

下面是一个示例XML文件,名为foobar.xml:

<?xml version="1.0"?>
<foo>
    <bar>hello</bar>
</foo>

我可以使用XPath的API,它是Java SDK的一部分来检索像这样的酒吧元素文本:

org.xml.sax.InputSource inputSource = new 
org.xml.sax.InputSource('c:/users/ndh/foobar.xml');
javax.xml.xpath.XPath xpath = 
    javax.xml.xpath.XPathFactory.newInstance().newXPath();
String text = (String)xpath.evaluate('/foo/bar/text()', 
    inputSource, javax.xml.xpath.XPathConstants.STRING);

现场文本将包含“你好”。



Answer 2:

由于urunler是在你的处理程序类为空,你要么做(A)空校验,如果它被允许为空或(B)定义urunler就是在类的构造函数,以便它不能为空:

(一种)

// ...
if (urunler != null) {
    urunler.setTitle("foo");
}

(B)

private final Urunler urunler;

public UrunlerHanlder(String qName) {
    urunler = new Urunler();
}


Answer 3:

你的问题是,您遇到的<title>的元素下<channel>元素,你遇到了一个以前<item>元素。 正因为如此,你urunler仍然是空当您尝试调用setTitle方法就可以了。

你或许应该做的是检查urunler不是null尝试设定值(盗贼建议)之前,因为显然有<title>你是不是真正感兴趣的内容。



文章来源: NullPointerException Java SAXParser
标签: java sax