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![]()
![]()
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![]()
![]()
Il throws va specificato nella dichiarazione del metodo: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;?
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".codice:public void unMetodo () throws IOException { ....qui è possibile che venga lanciato IOException.... }
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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!
Premesso che il tuo sorgente compila ok e tecnicamente sarebbe corretto ma ... dal punto di vista concettuale non va bene.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:
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:
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.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); }
È 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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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();
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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.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?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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.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![]()
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
Possibilità 2: passaggio di Settings dove servecodice: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); } } }
Ma ci sono certamente altre soluzioni, che dipendono solamente da come vuoi gestire le cose!! Spero di essermi spiegato.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 } }
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet