Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    Come usare IllegalArgumentException

    ciao a tutti!!
    guardando uno dei costruttori di JLabel, come questo: JLabel(String text, int horizontalAlignment). Come secondo argomento in genere si passa una costante tipo JLabel.LEFT, essendo questa costante di tipo intero.
    Se viene passato un valore non consentito viene sollevata una IllegalArgumentException.
    Quando si vuole come in questo caso passare come argomento una costante predefinita della classe, come si può gestire l'IllegalArgumentException ? Cioè, nella classe JLabel le variabili di tipo intere consentite sono ad esempio in un range da 1 a 5 e quindi viene fatta una cosa tipo

    codice:
    public JLabel( String text, int horizontalAlignment ) throws IllegalArgumentException {
       if( horizontalAlignment < 0 || horizontalAlignment > 5 )
          throw new IllegalArgumentException();
       ...
       ...
       ...
    }
    oppure la gestione viene fatta con tecniche piu sofisticate?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2

    Re: Come usare IllegalArgumentException

    Originariamente inviato da Poker1
    oppure la gestione viene fatta con tecniche piu sofisticate?
    In java la gestione degli errori principalmente viene fatta usando le classi RuntimeException ed Exception.
    La differenza sta nel fatto che le eccezioni di tipo RuntimeException sono unchecked, cioè nel momento in cui chiami un metodo, che nel suo corpo al verificarsi di determinate condizioni lancia/solleva un'eccezione di questo genere, il compilatore non ti chiede di gestire quella chiamata mediante il costrutto try{}catch(TuaEccezione var){}, mentre invece le eccezioni di tipo Exception sono checked e quindi vanno assolutamente gestite in qualche modo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    per rispondere alla tua domanda, andando a vedere un po' come JLabel gestisce questa roba dell'alignment ho trovato questo

    codice:
        protected int checkHorizontalKey(int key, String message) {
            if ((key == LEFT) ||
                (key == CENTER) ||
                (key == RIGHT) ||
                (key == LEADING) ||
                (key == TRAILING)) {
                return key;
            }
            else {
                throw new IllegalArgumentException(message);
            }
        }
    hai delle costanti, se tutto va bene viene ritornata la chiave: significa che stai passando un valore corretto, altrimenti vai in exception (in particolare IllegalArgumentException che è una derivata di RuntimeException come puoi vedere dalle API e come ti ha spiegato bene Vincenzo).
    Ora di tecniche più sofisticate non ne vedo il motivo: bisogna segnalare che viene passato un argomento non consentito e bloccarsi, questa mi resta la soluzione migliore.
    Detto questo, che intendi tu per tecniche più sofisticate?

  4. #4
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    pensavo che per fare questo tipo di gestione passando un intero si adottasse qualche altri sistema anzichè un semplice if, cmq va benissimo. Anche io avevo pensato appunto quella soluzione ( o la soluzione col range come avevo scritto ). Ma, visto che la seconda variabile deve assumere dei valori in un insieme finito ( LEFT, RIGHT etc ) non sarebbe meglio passare un enum ?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sono delle costanti (stanno nella classe SwingConstants), perché non si passa per enum non saprei, dovrei chiederlo a chi ha pensato/progettato le librerie.
    Il fatto che ci siano le enum non ti obbliga mica ad usarle

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da valia
    perché non si passa per enum non saprei, dovrei chiederlo a chi ha pensato/progettato le librerie.
    Pre-Java 5 .... no enum.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    ah ecco. Quindi se le librerie fossero riscritte oggi probabilmente sarebbe meglio passare un enum così da non dover sollevare eccezioni nel caso in cui il parametro passato non sia corretto ed essere sicuri che il parametro che viene passato sia automaticamente controllato in quanto appartenente all'enum...
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da andbin
    Pre-Java 5 .... no enum.
    ecco infatti non volevo dire una cavolata dicendo che essendo state scritte prima di java 5 non essendoci le enum si usavano le costanti grazie, preciso come sempre

    si se le riscrivessi probabilmente userei le enum, ma attento che devi mantenere una certa compatibilità delle lib (almeno con l'ultima disponibile), quindi le enum verranno usate da subito con codice ex-novo, altrimenti un periodo di transizione è assolutamente necessario

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.