java中的UnknownHostException(有时也是这样)

时间:2010-05-25 17:02:45

标签: java dns

我正在尝试阅读Yahoo的rss feed,但我无法使其正常工作。代码绝对正确,我很确定。它有时工作,但有时我得到UnknownHostException。可能是什么原因?我的网络或其他什么问题?这是我的代码: -

 public List<RssFeed> getRssFeed() {

        try {

            List<RssFeed> objList = new ArrayList<RssFeed>();


            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("http://rss.news.yahoo.com/rss/india");

            //doc.getDocumentElement().normalize();
            Element docElement = doc.getDocumentElement();
            NodeList objChannelList = docElement.getChildNodes();


            for (int intIndex = 0; intIndex < objChannelList.getLength(); intIndex++) {
                if (objChannelList.item(intIndex).getNodeType() == Node.ELEMENT_NODE) {


                    Element elemItem = (Element) objChannelList.item(intIndex);
                    NodeList itemList = elemItem.getElementsByTagName("item");

                    //show only 3 news
                    int count = itemList.getLength() > 3 ? 3 : objChannelList.getLength();

                    for (int intSubIndex = 0; intSubIndex < count; intSubIndex++) {
                        NodeList itemDetailList = itemList.item(intSubIndex).getChildNodes();
                        String strTitle = ((Node) itemDetailList.item(RSS_VALUES.TITLE.getValue())).getFirstChild().getNodeValue();
                        String strdescription = ((Node) itemDetailList.item(RSS_VALUES.DESCRIPTION.getValue())).getFirstChild().getNodeValue();
                        String strLink = ((Node) itemDetailList.item(RSS_VALUES.LINK.getValue())).getFirstChild().getNodeValue();
                        //System.out.println(strTitle + "\n" + strdescription + "\n" + strLink + "\n\n\n\n");
                        objList.add(new RssFeed(strTitle, strdescription, strLink));
                    }

                }
            }
            return objList;
        } catch (SAXException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

提前谢谢:)。自1个月以来,这个问题一直困扰着我。不知道为什么Java在这种情况下表现得像它的情绪:(

4 个答案:

答案 0 :(得分:4)

如果DNS服务器发生打嗝,可能会发生这种情况。除了使DNS服务器更强大或寻找另一个服务器之外,您还可以使用完整的IP地址而不是主机名。这样,它不需要根据主机名查找IP地址。 截至目前为止216.115.98.240

db.parse("http://216.115.98.240/rss/india");

但是,我宁愿修复DNS问题并更喜欢DNS,因为IP地址可能会不时发生变化。

更新:IP地址方法显然不适用于Yahoo News RSS feed域。然后,您应该真正使用主机名并修复DNS服务器问题。

答案 1 :(得分:2)

UnknownHostException表示指定的主机无法转换为IP地址。它很可能是您的DNS服务器的问题。

答案 2 :(得分:1)

如果DNS解析间歇性失败,请捕获异常并再次尝试,直到您获得名称解析。您只能控制,控制什么......如果您无法控制/修复DNS服务器,请使您的应用程序足够强大,以处理奇特的DNS服务器。

答案 3 :(得分:0)

我也没有明显的原因在Java中看到零星的UnknownHostExceptions。解决方案是仅重试几次。这是用于DocumentBuilder.parse的包装器,用于执行此操作:

static Document DocumentBuilder_parse(DocumentBuilder b, String uri) throws SAXException, IOException {
  UnknownHostException lastException = null;
  for (int tries = 0; tries < 2; tries++) {
    try {
      return b.parse(uri);
    } catch (UnknownHostException e) {
      lastException = e;
      System.out.println("Retrying because of: " + e);
      continue;
    }
  }
  throw lastException;
}