Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么类型对象的方法未定义?_Java_Sockets - Fatal编程技术网

Java 为什么类型对象的方法未定义?

Java 为什么类型对象的方法未定义?,java,sockets,Java,Sockets,我不确定Eclipse为什么会给我这个错误: 类型对象的方法listen()未定义 我犯了什么简单的错误?另外,我的代码是否是编写实例化EchoServer0对象并调用其listen方法的main方法的正确方法 public class EchoServer0 { public void listen() { ServerSocket socket = null; try{ socket = new ServerSocket

我不确定Eclipse为什么会给我这个错误:

类型
对象的方法
listen()
未定义

我犯了什么简单的错误?另外,我的代码是否是编写实例化
EchoServer0
对象并调用其
listen
方法的
main
方法的正确方法

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();
    } 
}
应该是这样的

public static void main(String[] args) {
        EchoServer0 e = new EchoServer0();
        // TODO Auto-generated method stub
        e.listen();
}
您的
Object
类型的变量确实没有这样的方法,但是您上面定义的
EchoServer0
类型肯定有这样的方法。

试试这个

public static void main(String[] args) {
    EchoServer0 myServer;
    myServer = new EchoServer0();
    myServer.listen();
}
您试图做的是声明一个类型为
Object
的变量,不为该变量创建任何引用,然后尝试调用一个不存在的方法(在类
Object
)来调用一个尚未创建的对象。它永远不会工作。

将主菜单更改为:

public static void main(String[] args) {
    EchoServer echoServer = new EchoServer();
    echoServer.listen();
}
当您声明对象EchoServer0时您有一些错误

  • EchoServer0属于Object类型,因此它没有listen()方法
  • 您还需要使用
    new
    创建它的实例
  • 另一个问题,这只是关于命名约定,您应该调用以小写字母开头的变量echoServer0,而不是echoServer0。大写名称通常用于类名
  • 不应创建与其类同名的变量。这令人困惑
  • 线路

    Object EchoServer0;
    
    表示您正在分配一个名为
    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;
    

    类型对象的listen()方法是未定义的
    非常简单。对象类不包含该方法。将您的
    EchoServer0
    变量声明为该方法的类型。编译器使用声明的变量类型查看它支持哪些方法。如果编写
    Object name=“Stack Overflow”
    ,则只能调用
    name
    的方法。编译器别无选择。在声明和方法调用之间,可以编写
    name=Integer.valueOf(1)
    。实际调用的方法取决于
    name
    的值和方法参数的声明类型。这纯粹是好奇:为什么不在同一行上声明和初始化?只是偏好?是的。我猜他/她可能想在这两者之间做其他事情。但这实际上只是一种习惯,而不是任何东西。您可能希望给出一段信息,说明为什么与OP相比,这是可行的,而不仅仅是代码+1.谢谢你的正确解决方案。我将添加一些注释。这“不仅仅”是一个命名约定问题,因为变量名与他的类名同名,这只会导致混淆。我必须尝试查看是否编译。EchoServer EchoServer=new EchoServer();EchoServer.echo();//echo()不是静态的!!