Java中的UnexPoointerException RSS阅读器

时间:2015-11-15 23:58:46

标签: java rss

我正在尝试更改我的RSS阅读器代码。我有这样的事情:

public class RSSFeedParser {

static final String TITLE = "title";
static final String DESCRIPTION = "description";
static final String CHANNEL = "channel";
static final String LANGUAGE = "language";
static final String COPYRIGHT = "copyright";
static final String LINK = "link";
static final String AUTHOR = "author";
static final String ITEM = "item";
static final String PUB_DATE = "pubDate";
static final String GUID = "guid";
public  InputStream in = read();
private XMLInputFactory inputFactory = XMLInputFactory.newInstance();
private XMLEventReader eventReader;


final URL url;

public RSSFeedParser(String feedUrl) {
    try {
        url = new URL(feedUrl);
        eventReader = inputFactory.createXMLEventReader(in);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

public Feed readFeed() {

    Feed feed = null;
    try {
        boolean isFeedHeader = true;
        String description = "";
        String title = "";
        String link = "";
        String language = "";
        String copyright = "";
        String author = "";
        String pubDate = "";
        String guid = "";



        while (eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();
            if (event.isStartElement()) {
                String localPart = event.asStartElement().getName().getLocalPart();
                switch (localPart) {
                    case ITEM:
                        if (isFeedHeader) {
                            isFeedHeader = false;
                            feed = new Feed(title, link, description, language, copyright, pubDate);
                        }
                        event = eventReader.nextEvent();
                        break;
                    case TITLE:
                        title = getCharacterData(event, eventReader);
                        break;
                    case DESCRIPTION:
                        description = getCharacterData(event, eventReader);
                        break;
                    case LINK:
                        link = getCharacterData(event, eventReader);
                        break;
                    case GUID:
                        guid = getCharacterData(event, eventReader);
                        break;
                    case LANGUAGE:
                        language = getCharacterData(event, eventReader);
                        break;
                    case AUTHOR:
                        author = getCharacterData(event, eventReader);
                        break;
                    case PUB_DATE:
                        pubDate = getCharacterData(event, eventReader);
                        break;
                    case COPYRIGHT:
                        copyright = getCharacterData(event, eventReader);
                        break;
                }
            }
            else if(event.isEndElement()) {
                if (event.asEndElement().getName().getLocalPart() == (ITEM)) {
                    FeedMessage message = new FeedMessage();
                    message.setAuthor(author);
                    message.setDescription(description);
                    message.setGuid(guid);
                    message.setLink(link);
                    message.setTitle(title);
                    feed.getMessages().add(message);
                }

            }
        }
    } catch (XMLStreamException e) {
        throw new RuntimeException(e);
    }
    return feed;
}

private InputStream read(){
    try{
        return url.openStream();
    }catch (IOException e){
        throw new RuntimeException(e);
    }
}
private String getCharacterData(XMLEvent event, XMLEventReader eventReader) throws XMLStreamException {
    String results="";
    event = eventReader.nextEvent();
    if(event instanceof Characters){
        results = event.asCharacters().getData();
    }
    return results;
}

主要:

   public static void main(String[] args) {
    RSSFeedParser parser = new RSSFeedParser("http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/rss.xml");
    Feed feed = parser.readFeed();
    System.out.println(feed);
    for (FeedMessage message : feed.getMessages()) {
        System.out.println(message);
        RSSFeedWriter writer = new RSSFeedWriter(feed, "articles.rss");
        try {
            writer.write();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我在

中得到NullPointerException
public  InputStream in = read(); 
return url.openStream();
RSSFeedParser parser = new RSSFeedParser("http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/other_sports/rss.xml");

这段代码有什么问题?当InputStream,XMLEventReader和XMLInputFactory在单独的类中时,一切都在工作。

1 个答案:

答案 0 :(得分:0)

在初始化URL对象之前,您正在调用read()方法。尝试这样的事情:

public InputStream in;

public RSSFeedParser(String feedUrl) {
    try {
        url = new URL(feedUrl);
        in = read();
        eventReader = inputFactory.createXMLEventReader(in);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

此外,最好在使用后关闭资源(流媒体和读者)。