2014-01-20 7 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 имеет тип объекта, поэтому он не имеет метод слушать()
  2. Вам также необходимо создать экземпляр с помощью new
  3. Еще одна проблема, это только в отношении соглашений об именовании , вы должны вызывать переменные, начиная с строчных букв, вместо echoServer0 вместо EchoServer0. Имена верхнего уровня обычно относятся к именам классов.
  4. Вам не следует создавать переменную с тем же именем, что и ее класс. Это сбивает с толку.
+2

Возможно, вы захотите дать фрагмент информации о том, почему это работает по сравнению с тем, что было у OP вместо кода. +1 для правильного решения. – csmckelvey

+0

Спасибо. Я добавлю несколько комментариев. –

+1

Это не «только» проблема согласования имен, потому что имя переменной имеет то же имя, что и его имя класса, что может только вызвать путаницу. – ajb

1

Линия

Object EchoServer0; 

говорит, что вы направляете в Object имя EchoServer0. Это не имеет никакого отношения к классу EchoServer0. Кроме того, объект не инициализирован, поэтому EchoServer0 - null. Классы и идентификаторы имеют отдельные пространства имен. Это на самом деле компиляции:

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; 
Смежные вопросы