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.