2014-01-20 127 views
2

我不知道爲什麼Eclipse是給我這個錯誤:爲什麼我的方法未定義類型對象?

The method listen() is undefined for the type Object

我在做什麼簡單的錯誤?另外,我的代碼是寫入main方法的正確方法,該方法實例化EchoServer0對象並調用其方法listen

public class EchoServer0 {  
    public void listen() { 
     ServerSocket socket = null; 
     try{ 
      socket = new ServerSocket(2013); 
      System.out.println("Opened server socket"); 
      socket.setSoTimeout(2000); 
      socket.accept(); 
      socket.close(); 
     } 
     catch (SocketTimeoutException ste){ 
      System.out.println("Timed out after " + 2000 + " ms"); 
     } 
     catch (Exception e){ 
      System.out.println(e.getClass().getName()+" at server: " + e.getMessage()); 
     }  
    } 

    public static void main(String[] args) { 
     Object EchoServer0; 
     EchoServer0.listen(); 
    } 
} 
+2

'方法listen()對於Object類型是未定義的這非常簡單。 Object類不包含該方法。用這種方法聲明你的'EchoServer0'變量是一個類型。 – csmckelvey

+0

編譯器使用聲明的變量類型來查看它支持的方法。如果你寫了'Object name =「Stack Overflow」',那麼你只需要'name'就可以調用'Object'的方法。編譯器沒有選擇。在聲明和方法調用之間,有人可以寫'name = Integer.valueOf(1)'。被調用的實際方法取決於'name'的值以及方法參數的聲明類型。 –

回答

0

它應該是這樣的

public static void main(String[] args) { 
     EchoServer0 e = new EchoServer0(); 
     // TODO Auto-generated method stub 
     e.listen(); 
} 

Object類型的變量確實不具備這樣的方法,但EchoServer0定義上述類型肯定有。

1

試試這個。

public static void main(String[] args) { 
    EchoServer0 myServer; 
    myServer = new EchoServer0(); 
    myServer.listen(); 
} 

什麼你試圖做的是聲明Object類型的變量,沒有創造任何東西該變量引用,然後試圖在對象上調用一個不存在的方法(在類Object)尚未創建。它永遠不會工作。

你的主要以
+0

這只是純粹的好奇心:你爲什麼不在同一行上聲明和初始化?只是偏好? – csmckelvey

+0

是的。我想,他/她可能想在其間做其他事情。但這實際上只是一種習慣而已。 –

+0

很酷,感謝您的反饋。 – csmckelvey

8

變化:

public static void main(String[] args) { 
    EchoServer echoServer = new EchoServer(); 
    echoServer.listen(); 
} 

當你聲明Object EchoServer0;你有幾個錯誤。

  1. EchoServer0是Object類型的,因此它沒有方法聽()
  2. 您還需要創建它的一個實例與new
  3. 另一個問題,這只是關於命名約定,你應該調用你的變量,以小寫字母開頭,echoServer0代替EchoServer0。大寫名稱通常用於類名稱。
  4. 您不應該使用與其類相同的名稱創建變量。這很混亂。
+2

你可能想給出一個關於爲什麼這個工作與OP有什麼相比,而不是隻是代碼的信息片段。 +1以獲得正確的解決方案。 – csmckelvey

+0

謝謝。我會添加一些評論。 –

+1

這不是「唯一」的命名約定問題,因爲變量名與他的類名具有相同的名稱,這隻會導致混淆。 – ajb

1

Object EchoServer0; 

說,你是一個分配命名ObjectEchoServer0。這與類EchoServer0無關。此外,對象未初始化,因此EchoServer0null。類和標識符具有單獨的名稱空間。這實際上編譯:

String String = "abc"; // My use of String String was deliberate. 

請保持到Java命名標準:類以大寫字母開頭,標識用小字母開頭,常量和enum s爲全大寫。

public final String ME = "Eric Jablow"; 
public final double GAMMA = 0.5772; 
public enum Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET} 
public COLOR background = Color.RED; 
相關問題