¿Otro post acerca de "Como dividir (split) una cadena separada por | (pipe) en Java"? NO!!! Por favor, lee la documentación de la API!!!!!

Esta entrada no es acerca de Java, ni es acerca de split ni String. Esta entrada habla de

La necesidad de chequear siempre la documentación de la API.

Permitidme ilustrarlo con un pequeño cuento.


Una pregunta frecuente entre programadores Java novatos es "Como dividir (split) una cadena separada por | (pipe)".

Sería ingenuo pensar que esto va a funcionar:

tokensArray = content.split("|");

Bien, (se supone que) eres un programador ordenado, y que (tu crees que) haces tu trabajo. Puedes analizar las primeras respuestas tras buscar la pregunta en google: esta, esta, otra nada más, or la última por ejemplo.

Y después de una breve "investigación", (estás orgulloso de tí mismo porque) tienes la respuesta "correcta":

tokensArray = content.split("\\|");

Si, el argumento es una expresión regular, y en expresiones regulares | es un metacarácter que representa el operador O. Tienes que protegerlo (frecuentemente llamado "escaparlo") usando \, bla bla bla bla.

Vamos a probarlo con un ejemplo. Estamos procesando un conjunto de líneas (registros), cada una con un puñado de cadenas (campos) delimitados por | (pipe). La estructura es:

FIRST_NAME | LAST_NAME | PROFESSION | BIRTH_DATE | DATE_OF_DEATH

Con este fragmento de código

package eu.albertomorales.mite.helloWorld;

public class SplitSample {

public static void main(String[] args) {
    SplitSample sample = new SplitSample();
    sample.doIt();
}

private void doIt() {
    /*
     * First line
     */
    String firstLine = "Terry|Pratchett|writer|1948|2015";
    splitAndPrint(firstLine);
}

private void splitAndPrint(String content) {
    String[] tokensArray;
    String firstName, familyName, profession, birthDate, dateOfDeath;
    tokensArray = content.split("\\|");
    firstName = tokensArray[0];
    familyName = tokensArray[1];
    profession = tokensArray[2];
    birthDate = tokensArray[3];
    dateOfDeath = tokensArray[4];
    System.out.println("First Name: "+firstName);
    System.out.println("Family Name: "+familyName);
    System.out.println("Profession: "+profession);
    System.out.println("Birth Date: "+birthDate);
    System.out.println("Date of Death: "+dateOfDeath);
}

obtenemos esta salida:

First Name: Terry Family Name: Pratchett
Profession: writer
Birth Date: 1948
Date of Death: 2015

Pero vamos a correr de nuevo el ejemplo con un escritor vivo (un escritor con la fecha de defunción vacia).

...

    /*
     * Second line
     */
    String secondLine = "Joanne|Rowling|writer|1965|";
    splitAndPrint(secondLine);

...

Lo que obtienes es una magnífica Excepción (ArrayIndexOutOfBoundsException). Sabes por qué? Porque no te has leido la documentación de la API, y el comportamiento predeterminado del método split NO es el que esperabas. Simple.


Y programaremos y cantaremos y bailaremos y viviremos felices para siempre.