26 октября 2014 г.

Отличия в парсинге целых чисел между java 6 и java 7

На днях на работе мы столкнулись с весьма интересной особенностью в реализации методов парсинга целых чисел. Мы использовали метод Long.parseLong() для преобразования строки с плюсом в начале в длинное целое. Оказывается, что в java 6 в этот метод можно передавать только целое число с минусом в начале, но нельзя с плюсом. При этом в java 7 можно передавать и с плюсом, и с минусом. И это отражено в документации. Но это ни разу не очевидно!

Конкретный пример:

System.out.println(Long.parseLong("+71234567890"));

Эта безобидная строка в java 7 распарсится без проблем, а в java 6 вызовет исключение java.lang.NumberFormatException.

Если пойти чуть дальше, то можно обнаружить, что подобное поведение верно для всех методов парсинга целых чисел, а именно: Byte.parseByte, Short.parseShort, Integer.parseInt и уже упомянутый Long.parseLong. То есть по сути в java 7 было изменено поведение этих методов! Может, для кого-то это и баян, но лично нам из-за этого пришлось делать хотфикс.