Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    non mi solleva la mia eccezione

    salve a tutti,
    sto seguendo un corso di programmazione in Java all'università, e sto cercando di spratichirmi un pò con l'argomento delle eccezioni.
    c'ho capito abbastanza relativamente alle eccezioni, ma mi sto inceppando su un mio esempio personale.
    in pratica ho creato una mia eccezione personalizzata che gestisca il superamento dei limiti di un array.
    vi posto sotto il codice.

    // codice classe che implementa la mia eccezione
    public class mia_eccezione extends ArrayIndexOutOfBoundsException {

    public mia_eccezione() {;}

    public mia_eccezione (String s) {
    super(s);
    }

    public void print_correctly(int [] a) { // funzione che stampi comunque il vettore

    for (int i=0; i<a.length; i++) {
    System.out.println(a[i]);
    }
    }

    }


    // codice main


    public class main {

    public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
    int [] array = new int[10];


    try{
    for (int i=0;i<12;i++) { // qui esco appositamente fuori limite
    array[i] =i;
    }
    }
    catch (mia_eccezione exc) {
    System.out.println("errore");
    exc.printStackTrace();
    exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }
    }

    ma quando compilo ed eseguo, guardate invece qual'è l'output della console:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at main.main(main.java:14)

    in altri termini, nonostante c'avessi piazzato un'eccezione derivata da arrayindexoutofbounds il gestore dell'eccezioni istanzia lo stesso una eccezione di tipo arrayindexoutofbounds, e la mia eccezione non viene sollevata.
    perchè? qualcuno saprebbe spiegarmelo?
    confido in vostre risposte.
    cordiali saluti
    lellone

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: non mi solleva la mia eccezione

    Originariamente inviato da lellone88
    salve a tutti,
    sto seguendo un corso di programmazione in Java all'università, e sto cercando di spratichirmi un pò con l'argomento delle eccezioni.
    c'ho capito abbastanza relativamente alle eccezioni, ma mi sto inceppando su un mio esempio personale.
    in pratica ho creato una mia eccezione personalizzata che gestisca il superamento dei limiti di un array.
    vi posto sotto il codice.

    // codice classe che implementa la mia eccezione
    public class mia_eccezione extends ArrayIndexOutOfBoundsException {

    public mia_eccezione() {;}

    public mia_eccezione (String s) {
    super(s);
    }

    public void print_correctly(int [] a) { // funzione che stampi comunque il vettore

    for (int i=0; i<a.length; i++) {
    System.out.println(a[i]);
    }
    }

    }


    // codice main


    public class main {

    public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
    int [] array = new int[10];


    try{
    for (int i=0;i<12;i++) { // qui esco appositamente fuori limite
    array[i] =i;
    }
    }
    catch (mia_eccezione exc) {
    System.out.println("errore");
    exc.printStackTrace();
    exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }
    }

    ma quando compilo ed eseguo, guardate invece qual'è l'output della console:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at main.main(main.java:14)

    in altri termini, nonostante c'avessi piazzato un'eccezione derivata da arrayindexoutofbounds il gestore dell'eccezioni istanzia lo stesso una eccezione di tipo arrayindexoutofbounds, e la mia eccezione non viene sollevata.
    perchè? qualcuno saprebbe spiegarmelo?
    confido in vostre risposte.
    cordiali saluti
    lellone
    Il codice mettilo fra tag [CODE].

    Innanzitutto se vuoi catturare un'eccezione non devi usare la clausola throws, che si usa invece quando non vuoi catturare una eccezione "checked" delegando al chiamante la gestione dell'eccezione. Inoltre non capisco perché print_correctly sia dentro la tua classe di eccezione, concettualmente non vedo alcun legame.

    Detto questo, tu hai "solo" definito una nuova eccezione, ma se chi causa l'eccezione (in questo caso l'array) sollevava una certa eccezione prima, continuerà a sollevarla ancora, non c'è alcun legame fra la tua eccezione e l'array che solleva un'ArrayIndexOutOfBoundsException. Non viene sollevata nessuna mia_eccezione, perché da nessuna parte c'è scritto "throw mia_eccezione".

    Se vuoi usare le tue eccezioni, devi anche sollevarle: ad esempio potresti fare un metodo che dato un array e un indice verifica se l'indice è valido, e se non lo è solleva un mia_eccezione, che il chiamante (del metodo) potrà catturare con un catch.

    P.S.: sarebbe consigliabile utilizzare le convenzioni stilistiche di Java (ma quelle basilari sono comuni a tutti i linguaggi), quali il camelCase. Inoltre puoi lasciare i costruttori vuoti, anche senza un punto e virgola.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Devi catturare l' eccezione che viene lanciata, se non c'è nessuna clausola catch che cattura il tipo di eccezione lanciata, il programma termina e ti viene segnalato il problema (suppongo tu stia usando un IDE).
    Cattura la ArrayIndexOutOfBoundsException:

    codice:
    try
    {
        for (int i=0;i<12;i++) 
        { 
            array[i] =i;
        }
    }
    catch (ArrayIndexOutOfBoundsException exc) 
    {
        System.out.println("errore");
        exc.printStackTrace();
        exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }

  4. #4
    no ragazzi, ci sto provando come mi avete consigliato, ma funziona sempre come prima, anche sollevando appositamente con la clausola throw la mia eccezione.

    ecco il codice:
    codice:
    public class main {
    
    
    	public static void main(String[] args) {
    		
    		int [] array = new int[10];
    		prova(array);
    		
    		try{
    	        prova (array);
    		}
    		catch(mia_eccezione exc) {
    			System.out.println("uscito fuori limiti");
    		}
    		
    	}
    	
    		
    		}
    
            public static void prova (int[] a) throws mia_eccezione {
                  for (int i=0;i<12;i++) {
                  if(i>10) throw new mia_eccezione();
                  a[i] = i;
                   }
    }
    
    
    // codice classe mia eccezione
    public class mia_eccezione extends ArrayIndexOutOfBoundsException {
    	
    	public mia_eccezione() {;}
    	
    	public mia_eccezione (String s) {
    		super(s);
    	}
    	
    	public void print_correctly(int [] a) {
    		
    		for (int i=0; i<a.length; i++) {
    			System.out.println(a[i]);
    		}
    	}
    
    }
    ma alla fine solleva sempre un'eccezione di tipo arrayindexoutofbounds

  5. #5
    Hai sbagliato la condizione nell'if.
    Se un vettore ha 10 elementi i suoi indici vanno da 0 a 9, pertanto arrivato a 10 solleverà l'IndexOutOfBoundException.
    ...

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    L' hai letto il mio post?

    Originariamente inviato da Who am I

    [...]

    codice:
    try
    {
        for (int i=0;i<12;i++) 
        { 
            array[i] =i;
        }
    }
    catch (ArrayIndexOutOfBoundsException exc) 
    {
        System.out.println("errore");
        exc.printStackTrace();
        exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }
    Come dicevo, sbagli la clausola del catch.
    Nel tuo codice l' eccezione viene lanciata,ma non catturata.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Who am I
    L' hai letto il mio post?



    Come dicevo, sbagli la clausola del catch.
    Nel tuo codice l' eccezione viene lanciata,ma non catturata.
    In realta' come ha detto l'utente sopra di te, la sua eccezione non viene nemmeno sollevata.

  8. #8
    si infatti, l'ho letto il tuo post who i am, ma non mi interessava sollevare la eccezione arrayindexoutofbounds, quanto piuttosto l'eccezione che io ho istanziato.

  9. #9
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    In realta' come ha detto l'utente sopra di te, la sua eccezione non viene nemmeno sollevata.
    Viene sollevata, il motivo è qua:

    codice:
    int[] array=new int[10];
    codice:
    try
    {
        for (int i=0;i<12;i++) 
        { 
            array[i] =i;
        }
    }
    catch (ArrayIndexOutOfBoundsException exc) 
    {
        System.out.println("errore");
        exc.printStackTrace();
        exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }
    Comunque per lanciare un' eccezione si usa la parola chiave throw:

    codice:
    try
    {
        throw new mia_eccezione;
    }
    catch(mia_eccezione e)
    {
        System.out.println(e);
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    lellone88, la risposta te l'ha data l'utente Caiodark.

    Originariamente inviato da Who am I
    Viene sollevata, il motivo è qua:

    codice:
    int[] array=new int[10];
    codice:
    try
    {
        for (int i=0;i<12;i++) 
        { 
            array[i] =i;
        }
    }
    catch (ArrayIndexOutOfBoundsException exc) 
    {
        System.out.println("errore");
        exc.printStackTrace();
        exc.print_correctly(array); // dovrebbe stamparmi comunque l'array
    }
    Comunque per lanciare un' eccezione si usa la parola chiave throw:

    codice:
    try
    {
        throw new mia_eccezione;
    }
    catch(mia_eccezione e)
    {
        System.out.println(e);
    }
    Nel codice dell'utente non viene sollevata perché quando l'indice del ciclo vale 10 la condizione dell'if non è soddisfatta (e quindi non viene lanciata la mia_eccezione), e nell'istruzione successiva si prova ad accedere al decimo elemento dell'array, che in un array di 10 elementi non esiste, e si solleva l'ArrayIndexOutOfBoundsException.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.