es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función String.charAt() de Java arroja una excepción de tipo java.lang.StringIndexOutOfBoundsException.

El siguiente código debería darme una cadena concatenada de todos los caracteres después de un espacio en una oración:

public class Main {
    public static void main(String[] args) {
        System.out.println(generateFromSentence("¡Hola Mundo!"));
    }

    public static String generateFromSentence(String sentence) {
        String output = String.valueOf(sentence.charAt(0));
        for (int i = 0; i <= sentence.length(); i++) {
            if (sentence.charAt(i) == ' ') {
                String following = String.valueOf(sentence.charAt(i+1));
                output = output.concat(following);
            }
        }
        return output;
    }
}

Lamentablemente, lanza una excepción:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
    at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
    at java.base/java.lang.String.charAt(String.java:702)
    at Main.generateFromSentence(Main.java:9)
    at Main.main(Main.java:3)

No entiendo por qué el índice estaría fuera de rango en:

String output = String.valueOf(sentence.charAt(0));

Especifico el índice 0: ¿no debería ser el primer carácter de mi cadena, verdad?

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay un error en la condición del bucle for en el método generateFromSentence.

    La condición del bucle for debería ser i < sentence.length() en lugar de i <= sentence.length().

    Esto se debe a que el índice del último carácter en una cadena es sentence.length() - 1.

    Al incluir el símbolo = en la condición, el bucle intenta acceder a un índice fuera de rango, lo que provoca la StringIndexOutOfBoundsException.

    Además, el código solo tiene en cuenta los espacios entre palabras y concatena solo el siguiente carácter después de un espacio. Si hay varios espacios entre palabras o si no hay espacios en la cadena, la implementación actual no funcionará como se espera.

    Una implementación más sólida para concatenar todos los caracteres después de un espacio en una oración sería:

    public static String generateFromSentence(String sentence) {
        // Comprobar si la oración es nula o vacía
        if (sentence == null || sentence.isEmpty()) {
            return "";
        }
    
        StringBuilder output = new StringBuilder();
    
        // Recorre cada carácter en la oración, omitiendo el primer carácter
        for (int i = 1; i < sentence.length(); i++) {
            // Comprobar si el carácter actual es un espacio
            if (sentence.charAt(i) == ' ') {
                // Añade todos los caracteres después del espacio a la salida
                output.append(sentence.substring(i+1));
                break; // Salir del bucle una vez concatenados todos los caracteres después del primer espacio
            }
        }
    
        return output.toString();
    }
    

    Esta implementacion usa un StringBuilder para concatenar todos los caracteres después del primer espacio y devuelve una cadena vacía si la oración de entrada es nula o vacía.

Comments are closed.