docenciait / ProgramacionDAW

0 stars 0 forks source link

excepciones #15

Closed javierbarbe closed 4 years ago

javierbarbe commented 4 years ago

Buenas Ivan. No entiendo bien el funcionamiento de las excepciones... Te paso un ejemplo de codigo : public class Ej1 {

public static void main(String[] args) {
    Scanner s= new Scanner(System.in);
    // TODO Apéndice de método generado automáticamente

int numero=0; ArrayList lista = new ArrayList(); for (int i= 0; i<6; i++) { System.out.println("Introduce un numero en la lista"); try { numero=s.nextInt(); }catch (Exception e) { System.out.println("eso no es un numero"); } lista.add(numero); } }

} Si introduzco algo que no sea un entero... el programa ejecuta el catch tantas veces como sea necesario hasta que se cumple la condicion del bucle for... digamos que lo que hace es poner Exception = true... y ya cada vez que el bucle se ejecuta ni siquiera pide entrada de datos... se genera continuamente una excepcion.... Lo que me gustaria que hiciese el programa es que cada vez que se aumente la i, el programa valore si lo que se le introduce genera o no excepciones... Un saludo

ivanjimenez commented 4 years ago

Hola, Javier: Lo anterior se te va a ejecutar 7 veces porque el try/catch está dentro del for. Para que valore que se produzca una excepción, no se ejecutará nada si se produce la excepción, en este caso no se ejecutaría nada después del nextInt(). Podrías utilizar una flag o variable booleana para que te valore si hay excepción o no.

Por otro lado, sii necesitas que el for acabe con el primer dato erróneo, el for lo tendrás que meter dentro del try/catch. Si te fijas nunca añadirá un elemento si el elemento erróneo se introduce en la entrada.

public class E1 {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        // TODO Apéndice de método generado automáticamente
        int numero = 0;
        ArrayList lista = new ArrayList();
        for (int i = 0; i < 6; i++) {
            System.out.println("Introduce un numero en la lista");
            try {
                numero = s.nextInt();
                lista.add(numero);
            } catch (Exception e) {

                System.out.println(e.getMessage());
            }

        }
        System.out.println(lista.toString());
    }

}
javierbarbe commented 4 years ago

Buenas Ivan. Lo he "solucionado" añadiendo s.next(); dentro del catch... Por desgracia... tu explicacion no la he entendido en absoluto. `

public class Ej1 {

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    // TODO Apéndice de método generado automáticamente
    int numero = 0;
    boolean numer;
    ArrayList<Integer> lista = new ArrayList<Integer>();
    for (int i = 0; i < 6; i++) {
        numer = true;
        do {
            System.out.println("Introduce un numero en la lista");

            try {
                numero = s.nextInt();
                lista.add(numero);
                numer = true;
            } catch (Exception e) {
                System.out.println("eso no es un numero");
                s.nextLine(); // limpia s
                numer = false;
            }
        } while (!numer);

    }
    for (Integer u : lista) {
        System.out.println(u);
    }
    System.out.println(lista.size() + " es el tamaño");
}

}`

ivanjimenez commented 4 years ago

Hola, Javier. ¿Cómo que no lo entiendes? Justamente es lo que te explicaba: estás utilizando una variable flag (que también se llama asi) como "numer" que detecta que es true si el número está bien pero si no la deja false. El nextLine se ejecutará sólo cuando se produzca la excepción. Lo tienes bien realizado.