Как стать автором
Обновить

Несовместимость метода String.split в Java 8 и Java 7

Время на прочтение1 мин
Количество просмотров21K
Это заметка о проблеме, с которой я столкнулся в процессе перевода проекта с Java 7 на Java 8. Случилось это уже около полугода назад, но написать решил сейчас, потому что неожиданно про нее(проблему) вспомнил.

Итак, с места в карьер.

Вот результат выполнения кода:
package test;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        System.out.println("result: " + Arrays.toString("0000".split("")));
    }
}

под Java 8:
result: [0, 0, 0, 0]

и Java 7:
result: [, 0, 0, 0, 0]


Как видите строка сплитится по разному, и из за этой проблемы я словил ArrayIndexOutOfBoundsException.
Было неприятно, но я смог пережить, собрал всю волю в кулак и решил разобраться в чем проблема.
Вот что пишет официальная документация:
When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array. A zero-width match at the beginning however never produces such empty leading substring.

Т.е. теперь в ситуации когда строка разбивается по пустому символу, нулевой пустой элемент не генерируется.
Такое поведение логичнее чем старое, но поломка совместимости для меня была неожиданностью. В любом случае сделать уже ничего нельзя, поэтому я желаю вам быть внимательными и словить как можно меньше проблем :).

P.S. Уже позже я нашел обсуждение этой проблемы на stackoverflow.com.
P.P.S. Как верно указал пользователь Borz это был баг. Видимо надо лучше читать ченджлоги.
Теги:
Хабы:
+12
Комментарии14

Публикации

Истории

Работа

Java разработчик
355 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн