【问题标题】:Unexcepted NullPointerException RSS Reader in JavaJava 中的无异常 NullPointerException RSS 阅读器
【发布时间】:2015-11-15 23:58:46
【问题描述】:

我正在尝试更改我的 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 在单独的类中时,一切正常。

【问题讨论】:

标签: java rss


【解决方案1】:

您在初始化 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);
    }
}

此外,最好在使用后关闭资源(流和阅读器)。

【讨论】:

  • 谢谢伙计!我很高兴你帮助了我。 :) done 方法后关闭流和程序完成后关闭流之间到底有什么区别?
  • 如果这是一个长时间运行的程序,那么让流打开可能会导致资源/内存泄漏,但在这个简短的程序中,当 main 方法完成时退出,关闭资源不是至关重要的。见stackoverflow.com/questions/515975/closing-streams-in-java
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2015-02-24
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多