Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390

    costruttori e eccezioni

    salve a tutti! ho un dubbio da dover necessariamente sciogliere!!!
    ho questo codice (non lo scrivo tutto....ma il necessatio per far capire)

    codice:
    public class Server extends Thread{
    	public final BufferedReader buffer;
    	public final Buffercirc circolare;
    	
    	Server (){
    		try{
    		buffer=new BufferedReader(new FileReader(new File("Server.txt")));
    		circolare=new Buffercirc();
    		}
    		catch (IOException e){
    			System.out.println("Errore in IO: "+e);
    		}
    	}
    		public void run(){
    			
    			String dati;
    			try{
    			while((buffer.readLine())!=null){
    				dati=buffer.readLine();
    				circolare.inserisci(dati);
    ....
    ...
    ..
    ora...dato che nel costrurrore di server ho gestito le eccezioni, il compilatore (in questo caso eclipse) mi avvisa che giustamente i campi buffer e circolare potrebbero non essere inizializzati quando andrò a richiamarmi lo start() per avviare il run del thread server (e successivamente anche client). come devo fare per risolvere questo problema???
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

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

    Re: costruttori e eccezioni

    Originariamente inviato da dmitraco
    ora...dato che nel costrurrore di server ho gestito le eccezioni, il compilatore (in questo caso eclipse) mi avvisa che giustamente i campi buffer e circolare potrebbero non essere inizializzati
    Questo è dovuto al fatto che i campi sono dei "blank final", non tanto perché hai gestito le eccezioni. Per i campi blank final esiste una regola semplice:

    A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.

    Il campo deve essere stato inizializzato entro la fine del costruttore.

    Il tuo codice (a parte l'errore segnalato dal compilatore) però così non va bene concettualmente. Immagina di togliere quei 'final' in modo che il tuo codice così come è con il try/catch possa compilare. Ma concettualmente sarebbe sbagliato.

    Catturare e basta la eccezione in quel punto è sbagliato. Supponiamo che FileReader lanci l'eccezione FileNotFoundException. Tu la catturi con il catch e stampi il messaggio di errore. Ma poi il costruttore completa correttamente e il chiamante otterrebbe un reference all'oggetto Server.

    Server s = new Server ();

    Peccato che il tuo oggetto Server sia rimasto in uno stato inconsistente, con i campi non inizializzati. Questo è sbagliato.

    Vuoi la soluzione che compili e che sia pure corretta concettualmente? NON catturare la eccezione nel costruttore ma falla uscire dal costruttore, dichiarandola con throws.

    codice:
    public class Server extends Thread{
    	public final BufferedReader buffer;
    	public final Buffercirc circolare;
    	
    	Server () throws IOException {
    		buffer=new BufferedReader(new FileReader(new File("Server.txt")));
    		circolare=new Buffercirc();
    	}
    ....
    Se nel costruttore viene lanciata una eccezione, in una riga come:

    Server s = new Server ();

    la assegnazione a 's' non viene eseguita, non ricevi un reference dell'oggetto e dovrai gestire tu la eccezione.
    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
    Registrato dal
    Dec 2001
    Messaggi
    390
    grazie 1000 x l'info..errore mio
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

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.