【问题标题】:Eclipse gives me a weird error when compilingEclipse 在编译时给了我一个奇怪的错误
【发布时间】:2010-03-31 01:12:53
【问题描述】:

我有这个函数,它返回一个数据类型 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[][] 但是当我将返回类型更改为 byte[][] 时,它抱怨该函数返回了错误的数据类型。我陷入了一个循环。有谁知道这里发生了什么?

【问题讨论】:

  • 首先你应该学会使用集合类而不是原始数组。其次,您应该学会为每个构造使用新的,而不是使用计数器迭代数组,充其量是一次性错误。

标签: java eclipse debugging


【解决方案1】:

基于lookupAllHostAddr 的小研究揭示了以下内容:

sun.net.spi.nameservice.NameService 接口已更改 JDK 6 的方式使得 Java 源代码无法 声明一个可以实现旧版本或新版本的类 (lookupAllHostAddr 方法的返回类型从 byte[][]InetAddress[])。 使用 JDK 6 必须解决这个问题!

【讨论】:

    【解决方案2】:

    这段代码很混乱。如果不了解您的其他课程,就不可能知道发生了什么。

    这段代码有很多不喜欢的地方。如果我看到一组对象的循环依赖于“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;
        }
    }
    

    【讨论】:

    • 我希望我写了这个,以便我可以根据您的建议更正它。我正在玩一个使用多个开源项目的大型开源项目,并试图让它正确编译,但它没有......我在想它可能与 jdk 版本有关(我正在使用目前是1.5.0.11),但是我这台机器上没有sudo来升级它...
    • 感谢您的宝贵时间。将我的 JDK 版本更改为 1.6 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多