Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Problema con Try-Catch

  1. #1

    Problema con Try-Catch

    codice:
    remove=new AbstractAction(){
                    public void actionPerformed(ActionEvent e) {
                    try{
                    id=Integer.parseInt(v.getId());
                        try {
                            if(m.removeBiglietto(id))
                                v.removeRow(id);
                        } catch (ApplicationException e1) {
                            v.showOption(e1.getMessage());
                        }        
                    }    
                        catch(Exception e2){
                            v.showOption("Formato ID non valido");        
                        }
                    }
                };
    Ho un problema con questo codice. v.getId() mi restituisce una stringa inserita in una JLabel e id=Integer.parseInt(v.getId()); mi verifica che sia un intero, lo converte e solo in tal caso fa partire il programma.
    Purtroppo a volte succede che mi dia l'errore pur avendo inserito un intero e non riesco a capire in base a quale criterio. Potete aiutarmi? Ho scritto qualcosa di insensato?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da wFree Visualizza il messaggio
    Purtroppo a volte succede che mi dia l'errore pur avendo inserito un intero
    È sufficiente anche solo uno spazio finale es.

    Integer.parseInt("12 ");

    o anche una stringa vuota "" per far lanciare NumberFormatException.

    Il formato è molto rigido e la documentazione è molto chiara.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Lo so, ma non è quello. Infatti, mi andrebbe anche bene facesse così.

    EDIT: Di più. Se io inserisco per esempio 20 e mi da errore, riprovo reinserisco 20 e questa volta mi da l'errore e1. E' possibile che la causa sia in questo try catch o devo cercare altro il bug?

    EDIT 2: sono piuttosto sicuro che l'errore sia qua. Inserendo qualche System.out.println(id); qua e là nel programma ho notato che il valore arriva sempre almeno fino m.removeBiglietto(id). Questo giustifica il fatto che al turno successivo mi dia un errore differente. Non riesco quindi a capire come mai parta il catch nonostante il valore id superi il try. Inoltre v.removeRow(id) non parte, nonostante la condizione dell'if venga rispettata.
    Ultima modifica di wFree; 28-06-2015 a 18:11

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Probabilmente hai qualche eccezione non gestita che viene intercettata dal catch(Exception e2)

    Prova a fare un catch di NumberFormatException al posto di Exception
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Accidenti, era proprio così. Ho risolto, grazie mille!

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da wFree Visualizza il messaggio
    Accidenti, era proprio così. Ho risolto, grazie mille!
    Felice di essere stato utile

    Un consiglio comunque: nei catch usa sempre il tipo dell'espressione che vuoi catturare, non un tipo generico. Ti accorgi subito degli errori e eviti di avere sorprese
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Ottimo, lo farò. Ancora grazie!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sarebbe bastato anche farsi stampare lo stackTrace (importantissimo per capire la natura dell'eccezione e il punto esatto in cui si verifica).
    Le eccezioni non vanno mai ammazzate (come, invece, stai facendo tu):


    codice:
    try {
       ...   // istruzioni
    } catch (Exception e) {   // Va benissimo anche il tipo generico
       e.printStackTrace();   // Oppure, se hai un sistema di logging userai quello
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Non ho ammazzato niente. Una volta sostituito il NumberFormatException, ho stampato lo stackTrace e ho risolto il bug. Grazie comunque.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da wFree Visualizza il messaggio
    Non ho ammazzato niente.
    Non hai capito il senso del mio intervento.

    Questa cosa qui significa ammazzare le eccezioni:

    codice:
    } catch (ApplicationException e1) {
       v.showOption(e1.getMessage());
    }

    Visualizzi da qualche parte la descrizione ( il getMessage() ) dell'eccezione: la descrizione dice poco o niente di ciò che accade... dice solo genericamente "è stata lanciata questa eccezione", ma non dice qual è la causa dell'eccezione, non dice a quale riga del codice è stata sollevata e, soprattutto, non dice qual è stata la catena di chiamate ai metodi che hanno portato a quell'eccezione. Tutte cose che, invece, vengono espressamente messe in evidenza (e che spesso sono fondamentali) dalla stampa dello stackTrace (nel modo che ti ho evidenziato prima).

    E' buona abitudine non ammazzare le eccezioni, ma farsi sempre stampare lo stackTrace, in modo da avere sempre il quadro completo di ciò che accade.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.