2014-10-27 2 views
0

У меня есть странная проблема:Невозможно прочитать Double с помощью сканера

если я передал строку «7 + 4», мой призыв к nextDouble() сгенерирует исключение InputMismatchException.

здесь полный код:

char ch; 
    try { 
     ch = getChar(); 
    } 
    catch(EOF e) //On détecte la fin de la chaine 
    { 
     return new Token(null); 
    } 

    //Si c'est un chiffre 
    if(Character.isDigit(ch)) 
    { 
     pushback(ch); 

     //On récupère un nombre 
     Scanner sc = new Scanner(in); 
     Token t = new Token(TokenKind.Number, sc.nextDouble()); 
     sc.close(); 

     return t; 
    } 

метод GetChar:

private char getChar() 
{ 
    try 
    { 
     //On essaie de lire un charactère. 
     int tmp_char = in.read(); 

     //Si le charctère n'est pas un caractère ASCII, on lève une exception. 
     if(Character.charCount(tmp_char) != 1) throw new IllegalCharacterException(); 
     return Character.toChars(tmp_char)[0]; 
    } 
    catch (IOException e) {throw new EOF();} 
} 

И теряемое (символ с)

private void pushback(char ch) 
{ 
    try 
    { 
     in.unread(ch); 
    } 
    catch (IOException e) {e.printStackTrace(); throw new RuntimeException("IOException");} 
} 

И in является PushbackReader инициализируется с " 7 + 4 ".

Если я звоню nextLine() до nextDouble(), он возвращает «4 + 7».

Что я сделал неправильно? Я на самом деле не понимаю ...

+0

Прочитайте, как значение 'double' определено как строка [здесь] (http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#valueOf%28java .lang.String% 29). – hexafraction

ответ

1

Okey, поэтому я отправляю решение, если у кого-то еще есть проблема.

Если вы хотите получить следующий Двойной в строке. первый звонок useDelimiter("") на вашем сканере.

РЕДАКТИРОВАТЬ: Не о разборке Двойной, но о сканере и PushbackReader: Кажется, что они не работают вместе ... Так что мои трюки не полезны в моем случае!

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