2016-08-25 2 views
9

У меня есть строка, в которой хранится номер. Теперь я хочу проанализировать эту строку и получить как float.У меня есть строчка, хранящаяся в виде строки. Исключение

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     try { 
      System.out.println(Integer.parseInt(" 2 ")); 
     } catch(NumberFormatException e) { 
      System.out.println("Exception caught"); 
     } 
     System.out.println(Float.parseFloat(" 2.4 ")); 

    } 
} 

Теперь в приведенном выше коде, если вы запустите его, он будет успешным. Мой вопрос: почему конечные пробелы в случае integer выбрасывают NumberFormatException, а синтаксический анализ float не бросает один?

PS: То же самое происходит при использовании booolean и double parsing.

PPS: Почему существует несогласованность в java? И я уже проверить исходный код

+0

почему бы вам не взглянуть на исходный код и узнать? Или посмотрите на @jens answer ;-) –

+4

@ScaryWombat Не нужно будет получать исходный код Java и читать его, чтобы знать, что делает этот метод; эта информация должна быть в JavaDoc метода. В этом случае JavaDoc из 'Float.parseFloat (String)' не говорит этого, но он говорит _... как выполняется методом valueOf класса Float ..._ и JavaDoc 'Float.valueOf (String) 'does say _Leading и завершающие пробельные символы в s игнорируются_. – SantiBailors

+0

@SantiBailors Спасибо - Отличный комментарий –

ответ

3

Как вы можете увидеть в исходном коде связанном, то значение будет отделано:

static FloatingDecimal.ASCIIToBinaryConverter readJavaFormatString(String arg) throws NumberFormatException { 
    boolean arg0 = false; 
    boolean arg1 = false; 

    try { 
     arg = arg.trim(); 
    .... 

Так заготовки будут удалены перед преобразованием в floatValue. Для получения дополнительной информации см. Исходный код FloatingDecimal, который вызывается Float.class.

Integer.parseInt() не TRIMM значение строки:

public static int parseInt(String arg, int arg0) throws NumberFormatException { 
    if (arg == null) { 
     throw new NumberFormatException("null"); 
    } else if (arg0 < 2) { 
     throw new NumberFormatException("radix " + arg0 + " less than Character.MIN_RADIX"); 
    } else if (arg0 > 36) { 
     throw new NumberFormatException("radix " + arg0 + " greater than Character.MAX_RADIX"); 
    } else { 
     int arg1 = 0; 
     boolean arg2 = false; 
     int arg3 = 0; 
     int arg4 = arg.length(); 
     int arg5 = -2147483647; 
     if (arg4 > 0) { 
      char arg8 = arg.charAt(0); 
      if (arg8 < 48) { 
       if (arg8 == 45) { 
        arg2 = true; 
        arg5 = MIN_VALUE; 
       } else if (arg8 != 43) { 
        throw NumberFormatException.forInputString(arg); 
       } 

       if (arg4 == 1) { 
        throw NumberFormatException.forInputString(arg); 
       } 

       ++arg3; 
      } 

      int arg7; 
      for (int arg6 = arg5/arg0; arg3 < arg4; arg1 -= arg7) { 
       arg7 = Character.digit(arg.charAt(arg3++), arg0); 
       if (arg7 < 0) { 
        throw NumberFormatException.forInputString(arg); 
       } 

       if (arg1 < arg6) { 
        throw NumberFormatException.forInputString(arg); 
       } 

       arg1 *= arg0; 
       if (arg1 < arg5 + arg7) { 
        throw NumberFormatException.forInputString(arg); 
       } 
      } 

      return arg2 ? arg1 : -arg1; 
     } else { 
      throw NumberFormatException.forInputString(arg); 
     } 
    } 
} 

Вот почему вы получите исключение там

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