Затмение дает мне странную ошибку при компиляции - PullRequest
1 голос
/ 31 марта 2010

У меня есть эта функция, которая возвращает тип данных 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 жалуется, что тип возвращаемого значения должен быть байтовым [] [], но когда я меняю тип возвращаемого значения на байтовый [] [], он жалуется, что функция возвращает неверный тип данных. Я застрял в петле. Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 31 марта 2010

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

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

1 голос
/ 31 марта 2010

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

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

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

Похоже, вы пытаетесь выполнить поиск DNS-сервера. Я хотел бы знать, если бы уже не было чего-то, что могло бы помочь (например, Apache James ).

ОБНОВЛЕНИЕ:

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

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