UnknownHostException в Java (что тоже только иногда) - PullRequest
5 голосов
/ 25 мая 2010

Я пытаюсь прочитать RSS-канал Yahoo, но не могу заставить его работать правильно Код абсолютно правильный, я в этом уверен. Иногда это работает, но иногда я получаю 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 ]

4 голосов
/ 25 мая 2010

Это может произойти, если произошел сбой в работе DNS-сервера. Помимо повышения надежности DNS-сервера или поиска другого, вы также можете просто использовать полный IP-адрес вместо имени хоста. Таким образом, не нужно искать IP-адрес на основе имени хоста. На данный момент это 216.115.98.240.

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

Однако я бы скорее решил проблему с DNS и предпочел бы DNS, поскольку время от времени IP-адреса могут меняться.

Обновление : подход с использованием IP-адреса, очевидно, не работает для домена RSS-канала Yahoo News. Затем вы должны использовать имя хоста и исправить проблему с DNS-сервером.

2 голосов
/ 25 мая 2010

UnknownHostException указывает, что указанный хост не может быть преобразован в IP-адрес. Это вполне может быть проблема с вашим DNS-сервером.

1 голос
/ 22 августа 2017

Если разрешение DNS периодически прерывается, перехватите исключение и повторите попытку, пока не получите разрешение имени. Вы можете контролировать только то, что можете контролировать ... А если вы не можете контролировать / исправлять DNS-сервер, сделайте свое приложение достаточно надежным для работы со странным DNS-сервером.

0 голосов
/ 06 апреля 2019

Я также вижу спорадические исключения UnknownHostException в Java без видимой причины. Решение состоит в том, чтобы просто повторить попытку несколько раз. Вот оболочка для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...