Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446

    si può creare e dichiarare un oggetto indicando anche throws Exception?

    come da topic,è possibile creare e dichiarare un oggetto indicando che potrebbe generare un eccezione?quale sarebbe la sintassi?

    Client myClient= new Client(primo) throws Exception;?

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: si può creare e dichiarare un oggetto indicando anche throws Exception?

    Originariamente inviato da energie
    come da topic,è possibile creare e dichiarare un oggetto indicando che potrebbe generare un eccezione?quale sarebbe la sintassi?

    Client myClient= new Client(primo) throws Exception;?
    Il throws va specificato nella dichiarazione del metodo:

    codice:
    public void unMetodo () throws IOException
    {
       ....qui è possibile che venga lanciato IOException....
    }
    Se però hai fatto questa domanda, presumo che tu non sappia che in Java le eccezioni si possono dividere in due grosse categorie: le eccezioni "checked" e quelle "unchecked".

    La differenza è importante:
    Per le eccezioni "checked" vale una regola molto semplice, che in inglese si dice "handle or declare". Vuol dire che una eccezione checked va: o gestita (con try-catch) oppure dichiarata con il throws. In ogni caso sei obbligato a tenerne conto.
    Una eccezione unchecked invece non sei obbligato a gestirla con try-catch e nemmeno a dichiararla con il throws. In pratica potresti anche non tenerne conto, ma dipende dal tipo di eccezione e da cosa devi fare.

    Le eccezioni checked sono tutte quelle che derivano da Exception ad esclusione di quelle che derivano da RuntimeException. Quelle unchecked sono tutte le altre.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    ciao andbin grazie come sempre per la risposta molto completa,si hai centrato il problema non ho ancora trattato le eccezioni,qui di seguito ti riporto il file java in cui è presente il metodo,il problema è che lì l'eccezione è indicata...ma mi da cmq l'errore:

    import java.util.*;
    import java.io.*;

    class Settings {

    private static Integer Porta;

    public Settings() throws Exception {
    this( 0);
    }

    public Settings(int porta) throws Exception{
    Porta = new Integer(porta);
    }

    public Settings (String a) throws Exception {
    this();
    this.load(new FileInputStream("settings.cfg"));
    }

    public void load(FileInputStream inStream) throws Exception {
    try {
    Properties prop = new Properties();
    prop.load(inStream);
    Porta=new Integer(prop.getProperty("Porta"));
    }
    catch (Exception e) {
    System.out.println("Error :"+e.toString());
    }
    }

    public Integer getPorta() throws Exception {
    return Porta;
    }
    }

    dove sbaglio?grazie!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da energie
    ciao andbin grazie come sempre per la risposta molto completa,si hai centrato il problema non ho ancora trattato le eccezioni,qui di seguito ti riporto il file java in cui è presente il metodo,il problema è che lì l'eccezione è indicata...ma mi da cmq l'errore:
    Premesso che il tuo sorgente compila ok e tecnicamente sarebbe corretto ma ... dal punto di vista concettuale non va bene.

    Allora: innanzitutto il metodo getProperty di Properties potrebbe ritornare null (se non ha trovato la proprietà). Passare un null nel costruttore di Integer, causerebbe un NumberFormatException (che è una eccezione unchecked).
    A parte questo, tu nel metodo load() hai gestito l'eccezione con try-catch, quindi le eccezioni non posso certo saltare "fuori" dal metodo.
    Potresti invece fare:

    codice:
    public void load(FileInputStream inStream) throws Exception {
        Properties prop = new Properties();
        prop.load(inStream);
        String s = prop.getProperty("Porta");
        if (s != null)
            Porta=new Integer(s);
    }
    In questo modo non gestisci l'eccezione ma la dichiari. Se lì dentro viene lanciata una eccezione, allora viene lanciata al di fuori del metodo.
    È chiaro che chi chiamerà il metodo load dovrà: o gestire l'eccezione con try-catch o a sua volta dichiararla con il throws.

    Comunque come "design" si può sicuramente migliorare: Settings() e Settings(int porta) non generano eccezioni, quindi il throws è inutile.
    Inoltre si potrebbe creare una nuova eccezione apposita per la tua gestione, un qualcosa tipo SettingsException.
    Ma dipende molto da cosa e come vuoi fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    l'oggetto viene creato subito dopo l'inizio della classe principale:

    mport java.io.*;
    import java.net.*;
    import java.util.*;
    import java.nio.*;
    import java.nio.channels.*;
    import java.nio.channels.spi.*;
    import java.nio.charset.*;


    public class Server extends Thread
    {
    static Settings mySettings = new Settings() ;
    static int porta=mySettings.getPorta();

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Guarda ... io ti faccio un esempio completo di come si potrebbe fare:

    Prova.java
    codice:
    public class Prova
    {
        public static void main (String[] args)
        {
            try
            {
                Settings s = new Settings ("settings.cfg");
    
                System.out.println ("Porta = " + s.getPorta ());
            }
            catch (SettingsException se)
            {
                System.out.println (se);
            }
        }
    }

    Settings.java
    codice:
    import java.io.*;
    import java.util.*;
    
    public class Settings
    {
        private Integer porta;
    
        public Settings ()
        {
            this (0);
        }
    
        public Settings (int porta)
        {
            this.porta = new Integer (porta);
        }
    
        public Settings (String filename)
            throws SettingsException
        {
            this ();
    
            load (filename);
        }
    
        public void load (String filename)
            throws SettingsException
        {
            try {
                FileInputStream fis = new FileInputStream (filename);
                load (fis);
                fis.close ();
            } catch (FileNotFoundException ioe) {
                throw new SettingsException ("File non trovato");
            } catch (IOException ioe) {
                throw new SettingsException ("Errore di I/O");
            }
        }
    
        public void load (InputStream is)
            throws SettingsException
        {
            Properties prop = new Properties ();
    
            try {
                prop.load (is);
            } catch (IOException ioe) {
                throw new SettingsException ("Errore di I/O");
            }
    
            String portaStr =  prop.getProperty ("Porta");
    
            if (portaStr != null)
            {
                try {
                    porta = new Integer (portaStr);
                } catch (NumberFormatException nfe) {
                    throw new SettingsException ("Parametro 'Porta' non valido");
                }
            }
        }
    
        public Integer getPorta ()
        {
            return porta;
        }
    }

    SettingsException.java
    codice:
    public class SettingsException extends Exception
    {
        public SettingsException ()
        {
            super ();
        }
    
        public SettingsException (String msg)
        {
            super (msg);
        }
    }
    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 energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    che dire,funziona benissimo per i metodi in cui posso aggiungere "throws Exception" tipo il main,ma ho un metodo public(public void run()) in cui non posso aggiungerlo,ma mi servirebbe poter leggere dal file di configurazione anche da lì,aiuti?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da energie
    che dire,funziona benissimo per i metodi in cui posso aggiungere "throws Exception" tipo il main,ma ho un metodo public(public void run()) in cui non posso aggiungerlo,ma mi servirebbe poter leggere dal file di configurazione anche da lì,aiuti?
    Spiega meglio che cosa vuoi fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    dunque,quello che sino ad ora abbiamo fatto è praticamente prendere il contenuto di una variabile "Porta:" da un file di configurazione.Questo funziona egregiamente per quanto riguarda il metodo main,ora,dovrei fornire altre variabili(prese sempre dal file di testo)ad altre parti del programma,ad esempio ad un metodo(public void run()),dato che la creazione dell'oggetto s di tipo Settings necessita che venga aggiunto throws Exception al metodo chiamante come dovrei fare se questa aggiunta al metodo run dà questo errore?

    run() in Server cannot implement run() in java.lang.Runnable; overridden method does not throw java.lang.Exception

    spero che sia chiaro

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da energie
    dunque,quello che sino ad ora abbiamo fatto è praticamente prendere il contenuto di una variabile "Porta:" da un file di configurazione.Questo funziona egregiamente per quanto riguarda il metodo main,ora,dovrei fornire altre variabili(prese sempre dal file di testo)ad altre parti del programma,ad esempio ad un metodo(public void run()),dato che la creazione dell'oggetto s di tipo Settings necessita che venga aggiunto throws Exception al metodo chiamante come dovrei fare se questa aggiunta al metodo run dà questo errore?

    run() in Server cannot implement run() in java.lang.Runnable; overridden method does not throw java.lang.Exception

    spero che sia chiaro
    Sì, è chiaro .... ma quello che non ti è chiaro è che le cose si possono fare in molti modi.
    L'esempio completo che ho fatto io, a livello concettuale, consente di avere più istanze dell'oggetto Settings. A questo punto dovresti chiederti: devi poter avere più istanze? Devi poter avere 1 sola istanza? Oppure non vuoi nemmeno avere istanze dell'oggetto Settings (in pratica fai tutto con metodi statici)?

    Adesso veniamo alla questione del run() di Runnable. C'è una regola molto semplice che si applica alla implementazione delle interfacce: i metodi implementati NON possono dichiarare con throws delle eccezioni "checked" che siano in più oppure più "larghe" rispetto alla definizione nella interfaccia. Si possono però eventualmente dichiarare (e lanciare) eccezioni "unchecked". Quindi, vedendo come è dichiarato run() in Runnable, si deduce che non si possono lanciare eccezioni "checked". Stop.

    A questo punto però fermati un momento e pensa un attimo: chi è che chiama il metodo run()??? Risposta: la JVM. Se anche tu lanciassi delle eccezioni nel metodo run(), esse finirebbero alla JVM e non a del tuo codice!!! Quindi come potresti catturarle??

    In definitiva, se vuoi che il Settings sia visibile anche in altri punti (oltre al main) ci possono essere molte possibilità:

    Possibilità 1: Settings statico nella classe del main
    codice:
    public class Prova
    {
        public static Settings globalSettings;
    
        public static void main (String[] args)
        {
            try
            {
                globalSettings = new Settings ("settings.cfg");
    
                .....
            }
            catch (SettingsException se)
            {
                System.out.println (se);
            }
        }
    }
    Possibilità 2: passaggio di Settings dove serve
    codice:
    public class Prova
    {
        public static void main (String[] args)
        {
            try
            {
                Settings s = new Settings ("settings.cfg");
    
                Runnable mioRun = new MioRunnable (s);
    
                Thread t = new Thread (mioRun);
                t.start ();
            }
            catch (SettingsException se)
            {
                System.out.println (se);
            }
        }
    }
    
    
    class MioRunnable implements Runnable
    {
        private Settings settings;
    
        public MioRunnable (Settings s)
        {
            settings = s;
        }
    
        public void run ()
        {
            ....  // qui usi settings
        }
    }
    Ma ci sono certamente altre soluzioni, che dipendono solamente da come vuoi gestire le cose!! Spero di essermi spiegato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.