Java if / else表现得很奇怪

时间:2010-05-22 10:13:04

标签: 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();

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

由于

4 个答案:

答案 0 :(得分:5)

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

line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST"))

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

尝试将substring().equals替换为startsWith

答案 1 :(得分:1)

  1. 您需要在修剪之前检查null。 trim()的结果永远不能为空。

  2. 你应该先在readLine()之前检查断开连接,否则你总是做一个readLine()太多了。

  3. 如果你从未接触到'其他',那就意味着其他一个条件总是如此。

答案 2 :(得分:1)

您的代码存在许多问题

  • in.readLine()。修剪() readLine do返回null并调用null.trim()将导致... NullPointerException
  • 是否有理由将EOF附加到您发送的每个回复中。
  • 调用substring而不确定它至少有那么多元素会抛出StringIndexOutOfBoundsException,如果它更短。

您是否正在使用“P”进行测试?

答案 3 :(得分:0)

其他人似乎不太可能没有执行。你确定你的循环没有退出这样的数据包,因此你的条件甚至没有运行?请问您 System.out.println(“已收到”+行);打印任何似乎缺少else语句的数据包?