Java if/else表现得很奇怪

Ale*_*lex 1 java sockets if-statement

我是java的真正新手,所以请原谅我这是一个毫无希望的直截了当的问题.

我的java游戏服务器中有以下内容:

// Get input from the client
    DataInputStream in = new DataInputStream (server.getInputStream());
    PrintStream out = new PrintStream(server.getOutputStream());
    disconnect=false;

    while((line = in.readLine().trim()) != null && !line.equals(".") && !line.equals("") && !disconnect) {
        System.out.println("Received "+line);

      if(line.equals("h")){
          out.println("h"+EOF); // Client handshake
          System.out.println("Matched 1");

      }else if (line.equals("<policy-file-request/>")) {
          out.println("..."+EOF); // Policy file
          System.out.println(server.getInetAddress()+": Policy Request");
          disconnect=true;
          System.out.println("Matched 2");

      }else if(line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST")){
          out.println("HTTP/1.0 200 OK\nServer: VirtuaRoom v0.9\nContent-Type: text/html\n\n..."); // HTML status page
          disconnect=true;
          System.out.println("Matched 3");


      } else {
          System.out.println(server.getInetAddress()+": Unknown command, client disconnected.");
          disconnect=true;
          System.out.println("Matched else");

      }

    }
    server.close();
Run Code Online (Sandbox Code Playgroud)

首先,客户端发送一个"h"数据包,并期望返回(握手).但是,我希望它在收到无法识别的数据包时断开客户端.由于某种原因,它对握手和HTML状态请求作出了很好的响应,但是当存在未知数据包时,从不执行else子句.

谢谢

Dav*_*ton 5

根据您的评论中添加的信息,似乎将发生的是客户端发送单个字符(例如'n').这条线

line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST"))
Run Code Online (Sandbox Code Playgroud)

将被执行,但因为line只有一个字符line.substring(0,3)会抛出一个StringIndexOutOfBoundsException.这可能导致您的程序失败,而您没有提到.或者你在代码的另一部分中进行了一些异常处理,这些异常处理是在你没有显示的代码的另一部分中进行的,这或者是在压制错误或打印日志行或者其他东西而你又没有提到过(或者注意到它).

尝试更换substring().equalsstartsWith