Autor Tema: java.lang.StringIndexOutOfBoundsExeption: String index out of range CU00659B  (Leído 4650 veces)

niurkafer

  • Principiante
  • **
  • Mensajes: 50
    • Ver Perfil
Hola buenas cuando compilo la clase me dice que no tengo ningun error de sitaxis y cuando abro el main para corroborar introduzco la pimera palabra y corre y no me aparece la letra 1 las de mas letras si y me da el siguiente error:
java.lang.StringIndexOutOfBoundsExeption: String index out of range: 4 (in java.lang.String)

Ayuda  :-\

Citar
Crea una clase con un método main que pida una entrada de teclado y usando un bucle while, el método length de la clase String y el método substring de la clase String, muestre cada una de las letras que componen la entrada. Por ejemplo si se introduce “ave” debe mostrar:

Letra 1: a
Letra 2: v
Letra 3: e


Código: [Seleccionar]
import java.util.Scanner;

public class TestWhile{
    public static void main(String [ ] arg){
        System.out.println ("Por Favor introdusca una palabra");
        String entradaTeclado ="";
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine();

        int longitudPalabra = entradaTeclado.length();
        int i = 0;
        while (true) {
            i ++;
            System.out.println ("Letra "+(i+1)+": "+entradaTeclado.substring (i,i+1)+"");
            if(i==longitudPalabra){break;}
        }
    }
}

« Última modificación: 15 de Agosto 2015, 14:51 por Alex Rodríguez »

SamML

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 18
    • Ver Perfil
Re:Error bucle con while en java CU00659B
« Respuesta #1 en: 14 de Agosto 2015, 19:04 »
Hola niurkafer, voy a darte mi opinión sin ser ningún experto.
El fallo que tienes es el típico fallo que se suele tener a la hora de visualizar un array.
Un string es un array, es decir, almacena cada carácter en una de sus celdas, de la forma por ejemplo:

[N,I,U,R,K,A,F,E,R]

¿Como accedemos a un caracter entonces?
Simplemente tenemos que saber que la primera posición corresponde a la posicion numero 0 y asi podremos acceder a cada una de ellas. En el ejemplo:

Posición 0 -> N
Posición 1 -> I
Posición 2 -> U
Posición 3 -> R
Posición 4 -> K
Posición 5 -> A
Posición 6 -> F
Posición 7 -> E
Posición 8 -> R

Fíjate que la ultima posición entonces corresponde a la posicion numero 8.

¿Que sucede entonces cuando usas la función .length?

Al aplicar la función length() a una cadena devuelve la longitud de la cadena, no devuelve la posicion del ultimo caracter. Imagina que aplico dicha función al ejemplo, obtendre un 9 pues hay 9 letras.

¿En que concluye esto?

Cuando recorremos un array o un string mediante un bucle no "iremos" desde el 0 hasta su longitud, si no desde el 0 hasta (su longitud -1) y de este modo recorreremos la cadena entera.
Aunque el metodo substring nos evita esta cuenta y nos permite indicarle el numero de caracter en vez de su posición interna.


El error que te da se debe a que el indice que recorre el array toma un valor superior al maximo indice que tiene este y por eso no puede obtener ningún dato, digamos.

Quiero comentarte también que para sentencias while simples como es el caso no es conveniente en absoluto el uso de break. Tu condicion para while es simplemente "true" con lo que creas un bucle que se ejecuta siempre excepto cuando cumples un if que colocas en el interior en cuyo caso hace un break.
Bien, este mismo funcionamiento lo consigues simplemente colocando la condicion de ese IF como condicion del bucle while. Te ahorras tiempo y quebraderos de cabeza y el unico handicap es que la condición es la contraria. Es decir si le dirás que se salga del bucle y haga break cuando sea 10 mejor que le digas al while que se ejecute mientras sea menor que 10 y asi lo hará.
Si añades al while la condicion NOT puedes conseguir el efecto de decirle "mientras no seas 10" haz esto { ... }
Yo por ejemplo aplico el not al while normalmente por manías de un buen profesor que tuve al final son costumbres pero romper la condición mediante un IF como en tu ejercicio no es la manera correcta, aunque se pueda.

Me explico:
FORMA CORRECTA
Código: [Seleccionar]
while (indice < 10) {
//Hago lo que tenga que hacer 10 veces//
indice ++ //incremento indice//
}

o si no

while !(indice >= 10) {
//Hago lo que tenga que hacer 10 veces//
indice ++ //incremento indice//
}
y por tanto no es necesario anidar un IF

INCORRECTO:
Código: [Seleccionar]
i=0
while (1=1) {
//Haces algo//
i++;
if (i >=10) {break;}
}

Te sugiero repetir el ejercicio teniendo lo que te he comentado en cuenta y verás que incluso resulta mas fácil entenderlo.
Saludos!
« Última modificación: 14 de Agosto 2015, 19:28 por SamML »

SamML

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 18
    • Ver Perfil
Re:Error bucle con while en java CU00659B
« Respuesta #2 en: 14 de Agosto 2015, 19:18 »
Bueno, aunque lo que te escrito es cierto para cuando utilices array, el metodo substring estoy viendo que fuciona con la longitud de la cadena. substring (0,9) por ejemplo, por lo que comenté en otro post que es una función de intervalo abierto. Internamente el mostrara la posición del array desde el 0 hasta el 8, es decir nos simplifica pensar XD

Ahora bien, para no liarte con lo anterior quería decirte que tu fallo no se debe a que el bucle hace demasiadas reiteraciones. Asique intenta buscar el fallo de cuando le estas pidiendo a tu programa que obtenga la letra que esta en una posición superior a la maxima longitud y por que :P.

Si ves que no lo entiendes comenta.
« Última modificación: 14 de Agosto 2015, 19:20 por SamML »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola niurkafer, tu código tiene además un defecto de concepción debido a que usas un while (true), que es una construcción no adecuada. Te dejo para que leas al respecto referencias.

Referencia: www.aprenderaprogramar.com/foros/index.php?topic=2865

Realizar un: while(true){

Citar
no es buena idea, ya que nos obliga a tener que usar alguna forma de salida que en la mayoría de los casos habría que tratar de evitar (como los break).

Que se entienda bien: los break son una forma válida y lícita de salir de un bucle, pero antes de que hagamos uso de esta sentencia (o de la forma que usaste), deberíamos agotar la posibilidad de salir del bucle while de una manera más elegante y limpia. Esa manera es aquella que evalúe la condición que consignamos entre los paréntesis del while.


Referencia: https://www.aprenderaprogramar.com/foros/index.php?topic=3074

Citar
Utilizas un bucle while cuya condición es 'true'. Es decir que el bucle while(true) será infinito hasta que se encuentre la sentencia break. Bueno, he de decirte que esto no conforma una buena práctica, no corresponde a un buen diseño de bucle. Siempre trataremos de resolver el problema evitando tener que salir del bucle a través de break.
Siempre intentaremos salir del bucle while cuando deje de cumplirse la condición entre sus paréntesis.

Referencia: https://www.aprenderaprogramar.com/foros/index.php?topic=2570

Citar
El código que has escrito funciona y cumple con la consigna planeada por el ejercicio.
De todos modos he de decirte que si bien existe la opción de salir de un bucle while a través de  break, trataremos de evitar la salida de esta forma.

Añadir además que una condición como while(true) prácticamente no se usa nunca cuando se está programando. Unicamente se usa a veces por ejemplo para poner ejemplos en un curso, pero while(true) equivale a "repite indefinidamente" y esto no debe utilizarse excepto si sabemos muy bien por qué hacerlo. En este ejercicio no debe usarse ni while(true) ni break.

Saludos
« Última modificación: 05 de Mayo 2020, 14:46 por Mario R. Rancel »

niurkafer

  • Principiante
  • **
  • Mensajes: 50
    • Ver Perfil
Ya he visto donde estaban mis errores y el código ha quedado así

Código: [Seleccionar]
import java.util.Scanner;

public class TestWhile{
    public static void main(String [ ] arg){
        System.out.println ("Por Favor introdusca una palabra");
        String entradaTeclado ="";
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine();
        int longitudPalabra = entradaTeclado.length();
        int i = 0;

        while (i < longitudPalabra) {
            System.out.println ("Letra "+(i+1)+": "+ entradaTeclado.substring (i,i+1)+"");
            i=i+1;
        }
    }
}

gracias :)
« Última modificación: 17 de Agosto 2015, 23:51 por César Krall »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".