Java if / else ведет себя странно - PullRequest
1 голос
/ 22 мая 2010

Я настоящий новичок в 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 ]

5 голосов
/ 22 мая 2010

Судя по информации, добавленной в ваших комментариях, клиент будет отправлять один символ (например, 'n'). Линия

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

будет выполнено, но, поскольку line - это всего лишь один символ, line.substring(0,3) выдаст StringIndexOutOfBoundsException. Либо это приводит к сбою вашей программы, и вы не упомянули об этом. Или в другой части вашего кода происходит обработка исключений, которую вы не показывали, и это либо подавление ошибки, либо печать строки журнала или чего-то еще, и опять вы не упомянули это (или заметили это). *

Попробуйте заменить substring().equals на startsWith

1 голос
/ 22 мая 2010

Существует ряд проблем с вашим кодом

  • in.readLine (). Дифферент () readLine do возвращает значение null, а вызов null.trim () приведет к ... NullPointerException
  • Есть ли причина добавлять EOF к каждому отправляемому вами ответу.
  • вызов подстроки, не убедившись, что в ней хотя бы столько элементов, вызовет StringIndexOutOfBoundsException, если она будет короче

Вы тестируете, например, "P"?

1 голос
/ 22 мая 2010
  1. Вы должны проверить на ноль, прежде чем обрезать его. Результат функции trim () никогда не может быть нулевым.

  2. Перед проверкой readLine () необходимо сначала проверить отключение, иначе вы всегда выполняете одну readLine () слишком много.

  3. Если вы никогда не добираетесь до своего «другого», это означает, что одно из других условий всегда выполняется.

0 голосов
/ 22 мая 2010

Казалось бы, маловероятно, что остальное не выполняется. Вы уверены, что ваш цикл не завершается на таких пакетах и, следовательно, ваши условия даже не работают? Ваш System.out.println («Получено» + строка); вывести что-нибудь для пакета, в котором отсутствует инструкция else?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...