2010-03-31 5 views
1

У меня есть эта функция, которая возвращает тип данных InetAddress []Затмение дает мне странные ошибки при компиляции

public InetAddress [] 
lookupAllHostAddr(String host) throws UnknownHostException { 
    Name name = null; 

    try { 
     name = new Name(host); 
    } 
    catch (TextParseException e) { 
     throw new UnknownHostException(host); 
    } 

    Record [] records = null; 
    if (preferV6) 
     records = new Lookup(name, Type.AAAA).run(); 
    if (records == null) 
     records = new Lookup(name, Type.A).run(); 
    if (records == null && !preferV6) 
     records = new Lookup(name, Type.AAAA).run(); 
    if (records == null) 
     throw new UnknownHostException(host); 

    InetAddress[] array = new InetAddress[records.length]; 
    for (int i = 0; i < records.length; i++) { 
     Record record = records[i]; 
     if (records[i] instanceof ARecord) { 
      ARecord a = (ARecord) records[i]; 
      array[i] = a.getAddress(); 
     } else { 
      AAAARecord aaaa = (AAAARecord) records[i]; 
      array[i] = aaaa.getAddress(); 
     } 
    } 
    return array; 
} 

Eclipse, жалуется, что тип возвращаемого значения должен быть байт [] [], но когда я изменить тип возвращаемого в byte [] [], он жалуется, что функция возвращает неправильный тип данных. Я застрял в петле. Кто-нибудь знает, что здесь происходит?

+0

Сначала вы должны научиться использовать классы Collections вместо raw Arrays. Во-вторых, вы должны научиться использовать новое для каждой конструкции вместо повторения массивов с помощью счетчика, в лучшем случае изобилует одним ошибкой. –

ответ

1

Небольшое исследование на основе lookupAllHostAddr показывает следующее:

Интерфейс sun.net.spi.nameservice.NameService был изменен для JDK 6 таким образом, что делает его невозможным для исходного кода Java в объявить класс, который может реализовать либо старую, либо новую версию (возвращаемый тип метода lookupAllHostAddr был изменен с на InetAddress[]). Использование JDK 6 должно исправить это!

+0

Отлично ... спасибо за это ...! – Legend

1

Этот код довольно запутанный. Невозможно узнать, что происходит, не зная о других ваших классах.

Существует много не нравится в этом коде. Если я вижу цикл над набором объектов, который зависит от «instanceof» для правильной работы, я не могу не думать, что полиморфизм будет лучшим решением.

Ваш звонок new Lookup(name, type).run() заставляет меня думать о Runnable и Threads, но это не то, что вы делаете.

Похоже, вы пытаетесь найти DNS-серверы. Мне было бы интересно, не было ли уже что-то доступное для помощи (например, Apache James).

UPDATE:

Я попытался взять метод и сделать его работу. Я убрал то, чего у меня не было, и уменьшил проблему до самой простой вещи, что мог. Он имеет подпись вашего метода и тот же тип возврата. Этот более простой пример работает. Если есть проблема, это должно быть в материалах, которые я удалил. Извините, я не могу быть более полезным.

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class HostLookup 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      HostLookup lookup = new HostLookup(); 

      String host = ((args.length > 0) ? args[0] : "localhost"); 
      InetAddress [] allHostAddresses = lookup.lookupAllHostAddr(host); 
      for (InetAddress address : allHostAddresses) 
      { 
       System.out.println("address: " + address); 
      } 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public InetAddress [] lookupAllHostAddr(String host) throws UnknownHostException 
    { 
     InetAddress[] array = InetAddress.getAllByName(host); 

     return array; 
    } 
} 
+0

Хотелось бы, чтобы я написал это, чтобы исправить его на основе ваших предложений. Я играю с большим проектом с открытым исходным кодом, который использует несколько проектов с открытым исходным кодом, и я пытаюсь его правильно скомпилировать, но это не так ... Я думал, возможно, это имеет какое-то отношение к версии jdk (я использую 1.5.0.11 в настоящее время), но у меня нет sudo на этой машине, чтобы обновить его ... – Legend

+0

Спасибо за ваше время. Изменение моей версии JDK до версии 1.6 устранило проблему. – Legend

Смежные вопросы