2016-11-16 2 views
0

эта проблема вызывает бесконечную петлю в следующем фрагменте кода:java.io.StringReader.read() (Java-8) возвращает неожиданный символ в конце строки

public static final List<String> extractTags(String source, Integer nTags) { 

    List<String> tags = new ArrayList<>(); 

    try (StringReader stringReader = new StringReader(source)) { 
     String tag = ""; 
     char c; 
     while ((c = (char) stringReader.read()) >= 0 && tags.size() < nTags) { 
     switch (c) { 
     case '<': 
      tag = ""; 
      break; 
     case '>': 
      tags.add(tag); 
      break; 
     default: 
      tag = tag + c; 
      break; 
     } 
     } 
    } catch (IOException e) { 
    } finally { 
     return tags; 
    } 
    } 

, если вызывается со следующими параметрами : источника = «мусор» nTags = 2

Используя отладчик, я понял, что после того, как строка была полностью итерации, метод чтения() возвращает символ «\ uFFFF» 65535 навсегда. Так почему мой вопрос?

Спасибо!

+1

Операция 'return' в блоке' finally' - это [плохая идея] (http://stackoverflow.com/questions/48088/returning-from-a-finally-block-in-java). – Jesper

+0

Почему вместо этого вы не используете 'String.charAt()'? –

+0

Почему String.charAt лучше? –

ответ

3

Потому что stringReader.read() возвращает -1 для конца потока, но вы отбрасываете его на char, который является единственным неподписанным типом данных в Java. Итак, вместо -1 вы получаете 65535 для конца потока, поэтому никогда не прерывайте цикл while.

Возможно, вы захотите бросить то, что читается в charвнутри цикл, а не при условии while.