2015-07-07 9 views
6
java version "1.7.0_45" 

CiaoCome gestire le eccezioni che si verificano quando un'istanza di un oggetto di classe

sto in fase di inizializzazione i metodi della classe nel costruttore. Tuttavia, il new URL(uploadUrl) genererà un'eccezione nel costruttore. Quindi, se questo accade, l'utente non dovrebbe essere in grado di continuare. Poiché il costruttore non può restituire nulla, mi chiedo quale sia il modo migliore per gestirlo?

Molte grazie per qualsiasi suggerimento,

public class MultipleFileTransfer { 
    private static final String TAG = MultipartUtility.class.getSimpleName(); 

    private DataOutputStream dataOutputStream; 
    private FileInputStream fileInputStream; 
    private HttpURLConnection httpURLConnection; 
    private URL url; 

    public MultipleFileTransfer(final String uploadUrl) { 
     dataOutputStream = null; 
     fileInputStream = null; 
     httpURLConnection = null; 

     try { 
      url = new URL(uploadUrl); 
     } catch (MalformedURLException e) { 
      Log.wtf(TAG, e.getMessage()); /* <-- How to handle a failure */ 
     } 
    } 

    /* Factory method that initializes the class methods and returns the class object */ 
    public static MultipleFileTransfer getInstance(final String uploadUrl) { 

     /* Check that a valid url has been entered correctly */ 
     if(!URLUtil.isValidUrl(uploadUrl)) { 
      Log.wtf(TAG, "Invalid url: " + uploadUrl); 
      return null; 
     } 

     return new MultipleFileTransfer(uploadUrl); 
    } 
} 
+1

L'oggetto deve persistere se il relativo URL è danneggiato? –

risposta

5

Poiché il costruttore non può restituire nulla, mi chiedo che sia il modo migliore per gestire questa situazione?

In genere, consentire all'eccezione di propagarsi al chiamante, direttamente o avvolgendolo nella propria eccezione di astrazione di livello superiore. (Nel tuo caso, solo permettendo sembra direttamente più appropriato.)

public MultipleFileTransfer(final String uploadUrl) throws MalformedURLException { 
// -------------------------------------------------^ 
    dataOutputStream = null; 
    fileInputStream = null; 
    httpURLConnection = null; 

    url = new URL(uploadUrl); 
} 

Dal momento che l'istanza non è utile senza l'URL, ha senso per la costruzione di sicuro.

Oppure, se si desidera accedere nel costruttore (ma se è di moltiplicazione, di solito ogni registrazione, se del caso sarebbe stato gestito dal chiamante):

// Logging and re-throwing, but probably not recommended 
public MultipleFileTransfer(final String uploadUrl) throws MalformedURLException { 
// -------------------------------------------------^ 
    dataOutputStream = null; 
    fileInputStream = null; 
    httpURLConnection = null; 

    try { 
     url = new URL(uploadUrl); 
    } catch (MalformedURLException e) { 
     Log.wtf(TAG, e.getMessage()); 
     throw e;      // <== Rethrowing 
    } 
} 
+0

@Crowder, grazie che ha senso per il primo suggerimento. – ant2009

3

mi viene in mente due modi decenti per gestire il situazione:

(1) Lasciare che il costruttore lanci un'eccezione. Ripristinare la stessa eccezione dopo la registrazione o lanciare un'eccezione diversa. Se l'eccezione che genera non è un RuntimeException (e MalformedURLException non è un RuntimeException), sarà necessario aggiungere una clausola throws al costruttore.

(2) Lasciare che il costruttore crei comunque un oggetto, ma contrassegnarlo come un oggetto "non valido" che non può essere utilizzato. Aggiungerei un metodo isValid() o isInvalid() in modo che il chiamante possa richiedere se è valido. Altri metodi dovrebbero lanciare IllegalStateException se vengono chiamati su un oggetto non valido.

Non penso che uno sia chiaramente migliore dell'altro. Dipende dalle preferenze e forse dal design del resto del programma.

Problemi correlati