2010-03-31 78 views
1

我有這個函數返回一個數據類型的InetAddress []的Eclipse編譯時給了我一個奇怪的錯誤

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類而不是原始數組。其次,您應該學會使用每個構造的新元素,而不是用一個計數器遍歷數組,而對於一個錯誤來說充其量是充滿的。 – 2010-03-31 02:37:41

回答

1

基於lookupAllHostAddr一個小小的研究揭示了以下內容:

的sun.net.spi.nameservice.NameService界面的方式,使得它不可能爲Java源代碼,以改變 爲JDK 6 聲明一個類可以實現舊版本或新版本 (lookupAllHostAddr方法的返回類型已從 byte[][]更改爲InetAddress[])。 使用JDK 6必須解決這個問題!

+0

太好了......謝謝你的...! – Legend 2010-03-31 02:42:45

1

這段代碼很混亂。如果不知道其他類別是什麼,就不可能知道發生了什麼。

有很多不喜歡這個代碼。如果我看到一組依賴於「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; 
    } 
} 
+0

我希望我寫這個,以便我可以根據您的建議進行更正。我正在使用一個大型的開源項目,它使用了多個開源項目,並試圖使它正確編譯,但它不......我想也許這與jdk版本有關(我正在使用目前1.5.0.11),但是我沒有sudo在這臺機器上升級它... – Legend 2010-03-31 01:33:19

+0

感謝您的時間。將我的JDK版本更改爲1.6可解決問題。 – Legend 2010-03-31 02:43:17