2015-03-07 2 views
0

В настоящее время я пишу базовый http-сервер. Одной из необходимых функций является отображение ошибки 400, если версия протокола равна 1,1, и нет линии хоста.NoSuchElementException при проверке строки

У меня есть следующий сканер, (строки массив, которые держат файл запрос)

Scanner scn = new Scanner(lines[0]); 
    String command = scn.next(); 
    String fileName = scn.next(); 
    String protocol = scn.next(); 
    Scanner scn2 = new Scanner(lines[1]); 
    String host = scn2.next(); 
    String hostline = scn2.next(); 

, а затем я следующее, если заявление, которое, как предполагается проверить, является ли Hostline пусто

if (protocol.equals("HTTP/1.1") && hostline.isEmpty()) { 
String reply="HTTP/1.0 400 Bad Request\r\n" + 
      "Connection: close\r\n" + 
      "Content-Type: " + contentType + "\r\n" + 
      datestr + 
      "<h1>HTTP/1.0 400 Bad Request</h1>\r\n"; 
outs.write(reply.getBytes()); } 

Когда я запускаю его и проверить его я получаю NoSuchElementException на этой линии:

String hostline = scn2.next(); 
+0

Что вы вводите в программу? – hfontanez

+0

Это данные из файла запроса, поскольку мы тестируем его с помощью netcat. Тот, который я использую, чтобы проверить это, если есть: GET /tiny.html HTTP/1.1 Хост: Connection: close – MikeyD

+0

Ваш пример работал на меня. Убедитесь, что ваш ввод правильный – hfontanez

ответ

2

Как вы сказали, это может быть, что «нет хоста линии». Как насчет добавления охранника?

String hostline = scn2.hasNext() ? scn2.next() : "" 
+0

Вот что я искал. большое спасибо – MikeyD

2

next() throws NoSuchElementException, если больше нет токенов. Таким образом, вы должны сначала проверить, если есть больше элементов с hasNext()

if (scn.hasNext()) { 
    variable = scn.next(); 
} 
+0

Спасибо, что решил – MikeyD

Смежные вопросы